Около 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);
}
1 ответ
Разница между
#include <math.h>
а также
#include <cmath>
является то, что первый ставит такие вещи, как sqrt
а также pow
в глобальное пространство имен (то есть вы ссылаетесь на них, просто сказав sqrt
или же pow
) и последний помещает их в пространство имен std
(т.е. вы ссылаетесь на них, говоря std::sqrt
или же std::pow
).
Если вы не хотите добавлять префикс к ним std::
все время вы можете явно помещать отдельные в глобальное пространство имен:
using std::sqrt;
или (хотя это не рекомендуется) вы можете вытащить в целом std
как это:
using namespace std;
Проблема в том, что в std
и вы, вероятно, не очень хотите их всех.