函数重载错误当重载cmath函数C++
我正在写一个简单的称为Vector2f的C++类。我有一个名为Vector2f.cpp的类文件和一个名为Vector2f.h的头文件。函数重载错误当重载cmath函数C++
我的Vector2f
类有一个功能,称为abs
,它返回一个新的Vector2f
与原始Vector2f
的每个组件的绝对值。我正在使用cmath库。但是,当我尝试使用cmath的abs
函数时,它认为我指的是一些未定义的函数Vector2f::abs(float)
,而不是cmath的abs
函数。为什么这里有一个命名冲突?如果不是C++能解决一个函数调用abs
,需要一个浮动仅在CMATH定义,而不是在Vector2f.h
这里是我的代码:
我的头文件:
//Vector2f.h
#ifndef VECTOR2F_H
#define VECTOR2F_H
class Vector2f
{
private:
float x;
float y;
public:
Vector2f(float x, float y);
float length();
float dot(Vector2f r);
Vector2f normalized();
Vector2f rot(float angle);
Vector2f add(Vector2f r);
Vector2f add(float r);
Vector2f sub(Vector2f r);
Vector2f sub(float r);
Vector2f mul(Vector2f r);
Vector2f mul(float r);
Vector2f div(Vector2f r);
Vector2f div(float r);
Vector2f abs();
float getX();
float getY();
};
#endif // VECTOR2F_H
我的类文件:
//Vector2f.cpp
#ifndef M_PI
#define M_PI 3.14159265358979323846264338327950288
#endif // M_PI
#include "Vector2f.h"
#include <cmath>
Vector2f::Vector2f(float x, float y)
{
this -> x = x;
this -> y = y;
}
float Vector2f::length()
{
return (float)sqrt(x * x + y * y);
}
float Vector2f::dot(Vector2f r)
{
return x * r.getX() + y * r.getY();
}
Vector2f Vector2f::normalized()
{
float length = Vector2f::length();
float xnormal = x/length;
float ynormal = y/length;
return Vector2f(xnormal, ynormal);
}
Vector2f Vector2f::rot(float angle)
{
double rad = angle * M_PI/180.0;
double c = cos(rad);
double s = sin(rad);
return Vector2f((float)(x * c - y * s), (float)(x * s + y * c));
}
Vector2f Vector2f::add(Vector2f r)
{
return Vector2f(x + r.getX(), y + r.getY());
}
Vector2f Vector2f::add(float r)
{
return Vector2f(x + r, y + r);
}
Vector2f Vector2f::sub(Vector2f r)
{
return Vector2f(x - r.getX(), y - r.getY());
}
Vector2f Vector2f::sub(float r)
{
return Vector2f(x - r, y - r);
}
Vector2f Vector2f::mul(Vector2f r)
{
return Vector2f(x * r.getX(), y * r.getY());
}
Vector2f Vector2f::mul(float r)
{
return Vector2f(x * r, y * r);
}
Vector2f Vector2f::div(Vector2f r)
{
return Vector2f(x/r.getX(), y/r.getY());
}
Vector2f Vector2f::div(float r)
{
return Vector2f(x/r, y/r);
}
Vector2f Vector2f::abs()
{
//I get the error, "error: no matching function for call to 'Vector2f::abs(float&)'", here
//when trying to call abs(x) and abs(y)
float xabs = abs(x);
float yabs = abs(y);
return Vector2f(xabs, yabs);
}
float Vector2f::getX()
{
return x;
}
float Vector2f::getY()
{
return y;
}
我的主文件:
//main.cpp
#include <iostream>
#include "Vector2f.h"
using namespace std;
int main()
{
Vector2f a(1.0f,2.0f);
cout<<a.getX()<<','<<a.getY()<<endl;
cout<<a.abs()<<endl;
return 0;
}
任何帮助,将不胜感激。
编辑:
错误消息:
error: no matching function for call to 'Vector2f::abs(float&)'
at line 80:
float xabs = abs(x);
error: no matching function for call to 'Vector2f::abs(float&)'
at line 81:
float yabs = abs(y);
的编译器的一个abs
unqualified lookup。然后会发生什么取决于你包含什么以及是否有使用声明(并且有趣的是编译器)。 cmath
中的所有内容均在命名空间std
中定义,因此您必须通过std::
来限定您的呼叫。
Vector2f Vector2f::abs()
{
//I get the error, "undefined reference to `Vector2f::abs(float)'", here
//when trying to call abs(x) and abs(y)
float xabs = std::abs(x);
float yabs = std::abs(y);
return Vector2f(xabs, yabs);
}
如果你有using std::abs
或using namespace std
地方Vector2d::abs
之前,你可以只用::abs
资格。 Compilers are allowed to declare C functions such as abs
in the global namespace in addition to namespace std
,所以取决于编译器使用::abs
可能工作或没有使用声明。 Clang 3.8接受代码,gcc不接受。 PS:我希望函数Vector2f::abs
可以计算矢量范数,而不是具有原始分量绝对值的矢量。但是,我不是数学家。
是的,我刚刚编辑我的问题与正确的实施。尽管我仍然遇到不同的错误。 –
另外我有一个规范化的函数,它与绝对值函数分开。与矢量的数学特性相比,ABS更适合游戏编程。 :P –
@OrrenRavid我仍然在问题中看到'float xabs = abs(x);'。一般来说,最好用完整的错误信息发布最少的例子。 – Jens
什么是错误信息? – songyuanyao
我看到你已经在'Vector'类中声明了一个额外的'float abs(float);'函数,但是你从来没有实现过它。 – Neozaru
...但你已经在你的'Vector2f'类中声明了一个'float abs(float)'方法,但没有实现它。当然它会尝试使用那个。删除声明。 –