函数重载错误当重载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); 
+0

什么是错误信息? – songyuanyao

+1

我看到你已经在'Vector'类中声明了一个额外的'float abs(float);'函数,但是你从来没有实现过它。 – Neozaru

+0

...但你已经在你的'Vector2f'类中声明了一个'float abs(float)'方法,但没有实现它。当然它会尝试使用那个。删除声明。 –

的编译器的一个absunqualified 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::absusing 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可以计算矢量范数,而不是具有原始分量绝对值的矢量。但是,我不是数学家。

+0

是的,我刚刚编辑我的问题与正确的实施。尽管我仍然遇到不同的错误。 –

+0

另外我有一个规范化的函数,它与绝对值函数分开。与矢量的数学特性相比,ABS更适合游戏编程。 :P –

+0

@OrrenRavid我仍然在问题中看到'float xabs = abs(x);'。一般来说,最好用完整的错误信息发布最少的例子。 – Jens