Около 200 ошибок при использовании cmath в Visual Studio 2015

Попытка получить код, компилируемый в g++, для компиляции в VS2015. Я безуспешно осматривал SO и Google, но cmath задокументирован в MSDN. Я предполагаю, что мне не хватает чего-то действительно очевидного или простого.

cmath выдает много ошибок, большинство ошибок, которые я получаю во время компиляции, и половина из них имеют форму:

the global scope has no "<function>"

другие в форме

'<function>': redefinition; different exception specification

'<function>': identifier not found

'<function>': is not a member of "global namespace"

Я не понимаю, почему выдаются эти ошибки, но если я использую math.h, большинство моих ошибок компиляции исчезают (включая некоторые из других стандартных библиотек, которые тоже вылетают).

Изменить: по запросу, код. Я использую функции sqrt и pow:

#include "vector.h"
#include <cmath>

using namespace vectormath;

vector::vector()
{
    this->_x = 0;
    this->_y = 0;
    this->_z = 0;
    this->_length = 0;
}
vector::vector(float x, float y, float z)
{
    this->_x = x;
    this->_y = y;
    this->_z = z;
    this->_length = sqrt(pow(_x, 2) + pow(_y, 2) + pow(_z, 2));
}

vector * vectormath::crossproduct(vector * a, vector * b)
{
    vector * result = new vector();

    result->_x = a->_y * b->_z - a->_z * b->_y;
    result->_y = a->_z * b->_x - a->_x * b->_z;
    result->_z = a->_x * b->_y - a->_y * b->_x;

    return result;
}

point::point()
{
    this->_x = 0.0;
    this->_y = 0.0;
    this->_z = 0.0;
}

point::point(float x, float y, float z)
{
    this->_x = x;
    this->_y = y;
    this->_z = z;
}

float vectormath::dotproduct(vector a, vector b)
{
    return a._x * b._x + a._y * b._y + a._z * b._z;
}

vector * vectormath::add(point * a, vector * b)
{
    vector * c = new vector();

    c->_x = a->_x + b->_x;
    c->_y = a->_y + b->_y;
    c->_z = a->_z + b->_z;

    return c;
}

Редактировать: и vector.h

namespace vectormath
{
    struct vector
    {
        float _x;
        float _y;
        float _z;
        float _length;

        vector();
        vector(float x, float y, float z);
    };

    struct point
    {
        float _x;
        float _y;
        float _z;

        point();
        point(float x, float y, float z);
    };
    vector * crossproduct(vector*, vector*);
    float dotproduct(vector a, vector b);
    vector * add(point * a, vector * b);
}

person Marko Galesic    schedule 14.04.2016    source источник
comment
Где ваш код, который использует cmath? У вас есть минимально воспроизводимый пример?   -  person Niall    schedule 14.04.2016
comment
Можете ли вы также показать свою декларацию об использовании cmath? На всякий случай :)   -  person Guy S    schedule 14.04.2016
comment
Я не могу воспроизвести ошибку на webcompiler.cloudapp.net (компилятор VS). Я не уверен, что заголовок не имеет защиты включения или #pragma once... может вызвать проблемы, если он включен в несколько файлов cpp.   -  person Niall    schedule 14.04.2016


Ответы (1)


Разница между

#include <math.h>

а также

#include <cmath>

заключается в том, что первый помещает такие вещи, как sqrt и pow, в глобальное пространство имен (т. е. вы ссылаетесь на них, просто говоря sqrt или pow), а второй помещает их в пространство имен std (т. е. вы ссылаетесь на них, говоря std::sqrt или std::pow).

Если вы не хотите постоянно добавлять к ним префикс std::, вы можете явно поместить отдельные из них в глобальное пространство имен:

using std::sqrt;

или (хотя это не рекомендуется) вы можете вытащить весь std следующим образом:

using namespace std;

Проблема в том, что в std много имен, и вам, вероятно, не нужны все.

person Gareth McCaughan    schedule 14.04.2016