2010-09-28 112 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; 

}