2016-08-24 90 views
1

我正在寫一個簡單的稱爲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)'方法,但沒有實現它。當然它會嘗試使用那個。刪除聲明。 –

回答

3

的編譯器的一個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