二进制*未找到运算符

时间:2010-09-28 03:28:05

标签: c++ visual-studio-2008 operator-overloading

我有一个带有正确重载的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不是很有帮助。这是我收到的唯一编译错误或警告。

4 个答案:

答案 0 :(得分: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;
}

所以,问题必定在其他地方。

答案 1 :(得分: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?

答案 2 :(得分: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;

}

答案 3 :(得分: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);
}