2010-09-28 96 views
0

我有一個正確的超載Vect * float運算符的向量類,並試圖按如下方式創建全局/非成員float * Vect運算符:(請注意,這是一個嚴重編輯的示例)二進制*運算符未找到

class Vect 
{ 
    public: 
     Vect::Vect(const float p_x, const float p_y, const float p_z, const float p_w); 
     Vect operator*(const float p_sclr) const; 
    private: 
     float x; 
     float y; 
     float z; 
     float w; 
}; 
Vect::Vect(const float p_x, const float p_y, const float p_z, const float p_w) { 
    x = p_x; 
    y = p_y; 
    z = p_z; 
    w = p_w; 
} 
Vect Vect::operator*(const float p_sclr) const { 
    return Vect((x * p_sclr), (y * p_sclr), (z * p_sclr), 1); // reset w to 1 
} 
//Problem Non-MemberOperator 
Vect operator*(const float p_sclr, const Vect& p_vect); 
Vect operator*(const float p_sclr, const Vect& p_vect) { 
    return p_vect * p_sclr; 
} 

但是,當我去考了與調用操作:

Vect A(2.0f, 3.0f, 4.0f, 5.0f); 
float s = 5.0f; 
Vect C, D; 
C = A * s; // Fine 
D = s * A; // Error as below 

我收到以下編譯錯誤:

錯誤C2678:二進制「*」:沒有操作員發現這需要一個類型'float'的左側操作數(或者沒有可接受的轉換)

任何人都可以提供有關這種情況的原因嗎? MS文檔位於http://msdn.microsoft.com/en-us/library/ys0bw32s(v=VS.90).aspx,對Visual Studio 2008不是很有幫助。這是我收到的唯一編譯錯誤或警告。

+0

確定嗎?我希望'A * s'不能工作,並且''A'工作... – 2010-09-28 03:31:25

+0

請發佈一個完整的簡短示例,以便人們可以看到,如何以及在哪裏定義了Vect以及在您定義的名稱空間中運算符* – sellibitze 2010-09-28 03:32:30

+0

在關閉花括號之後,您沒有用分號標記Vect類的結尾。這是複製粘貼錯誤還是代碼實際上看起來像? – AndyG 2010-09-28 04:05:17

回答

0

最終的解決辦法是去是因爲友元函數變量在p_vect中是私人的:

//class definition 
friend Vect operator*(const float scale, const Vect& p_vect); 

//function 
Vect operator*(const float p_sclr, const Vect& p_vect) { 
    return Vect((p_vect.x * p_sclr), (p_vect.y * p_sclr), (p_vect.z * p_sclr), 1.0f); 
} 
+0

它如何解決原始問題?爲什麼你認爲運算符*(float,Vect)稍微不同的實現會突然讓編譯器以不同的方式查找運算符?下一次,只需提供包含真實錯誤消息的完整示例。 – sellibitze 2010-09-28 07:08:22

+0

它解決了原來的問題,因爲編譯器現在已經存在該函數。不知道爲什麼它不在首位。發佈一個完整的例子意味着複製600多行代碼中的文件,並且我無法用另一個小型的從頭測試複製問題。 – 2010-09-28 21:43:07

3

您還沒有發佈完整的的例子。我可以編譯下面的代碼沒有任何問題:

class vect 
{ 
    float coeffs[4]; 
public: 
    vect() 
    { 
     for (int k=0; k<4; ++k) 
      coeffs[k] = 0; 
    } 

    vect(float x, float y, float z, float w) 
    { 
     coeffs[0] = x; 
     coeffs[1] = y; 
     coeffs[2] = z; 
     coeffs[3] = w; 
    } 

    vect operator*(float scalar) const 
    { 
     return vect(
      scalar*coeffs[0], 
      scalar*coeffs[1], 
      scalar*coeffs[2], 
      scalar*coeffs[3]); 
    } 
}; 

vect operator*(float scalar, vect const& x) 
{ 
    return x*scalar; 
} 

void test() 
{ 
    vect a (2,3,4,5); 
    float s = 5; 
    vect c, d; 
    c = a * s; 
    d = s * a; 
} 

所以,問題必須在別的地方。

+0

+1。你很快! – AndyG 2010-09-28 03:52:04

3

我也可以編譯代碼沒有任何問題(如sellibitze,誰打我吧!)

這是我使用的代碼:

//main.cpp 

#include <iostream> 
using namespace std; 


class Vect 
{ 

public: 
    float x,y,z,w; 
Vect(const float p_x, const float p_y, const float p_z, const float p_w) { 
    x = p_x; 
    y = p_y; 
    z = p_z; 
    w = p_w; 
} 
Vect() 
{ 
    x=y=z=w=0; 
} 

Vect operator*(const float p_sclr) const { 
    return Vect((x * p_sclr), (y * p_sclr), (z * p_sclr), 1); // reset w to 1 
} 


}; 

Vect operator*(const float p_sclr, const Vect& p_vect) { 
    return p_vect * p_sclr; 
} 


int main() 
{ 
    Vect A(2.0f, 3.0f, 4.0f, 5.0f); 
    float s = 5.0f; 
    Vect C, D; 
    C = A * s; // Fine 
    D = s * A; // Error as below 
    cout << D.x << endl; 
    return 0; 
} 

編輯:像sellibitze表明,問題可能謊言在別處。你列出了你的編譯器給你的唯一錯誤的錯誤?另外,你正在運行什麼版本的Visual Studio?

1

看起來像2打我給它,但它的工作對我來說太 - 建成並運行良好(VS2010,Win32控制檯項目):

class Vect 
{ 
public: 
    float x,y,z,w; 
    Vect::Vect(){} 
    Vect::Vect(const float p_x, const float p_y, const float p_z, const float p_w) 
    { 
     x = p_x; 
     y = p_y; 
     z = p_z; 
     w = p_w; 
    } 
    Vect Vect::operator*(const float p_sclr) const 
    { 
     return Vect((x * p_sclr), (y * p_sclr), (z * p_sclr), 1); // reset w to 1 
    } 
}; 

Vect operator*(const float p_sclr, const Vect& p_vect) { return p_vect * p_sclr;} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Vect a (2,3,4,5); 
    float s = 5; 
    Vect c, d; 
    c = a * s; 
    d = s * a; 

}