2016-08-24 9 views
1

私はVector2fという単純なC++クラスを作成しています。私はVector2f.cppと呼ばれるクラスファイルと、Vector2f.hと呼ばれるヘッダファイルを持っています。関数のオーバーロード時のオーバーロード時のエラーcmath関数C++

私のVector2fクラスには、Vector2fの各コンポーネントの絶対値で新しいVector2fを返すabsという関数があります。私はcmathライブラリを使用しています。しかし、私がcmathのabs関数を使用しようとすると、cmathのabs関数ではなく、定義されていない関数Vector2f::abs(float)を参照していると思います。ここに名前の競合があるのはなぜですか?

私のヘッダファイル:

//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 

C関数は浮動小数点数をとるabsだけcmathで定義されていない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::で通話を限定する必要があります。あなたがusing std::absusing namespace 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); 
} 

どこか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

関連する問題