Двоичный * оператор не найден - PullRequest
0 голосов
/ 28 сентября 2010

У меня есть векторный класс с правильно перегруженным оператором 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 ]

3 голосов
/ 28 сентября 2010

Я также могу без проблем скомпилировать код (например, 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 вы используете?

3 голосов
/ 28 сентября 2010

Вы все еще не опубликовали завершенный пример. Я могу без проблем скомпилировать следующий код:

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 голос
/ 28 сентября 2010

Похоже, 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;

}
0 голосов
/ 28 сентября 2010

Окончательное решение состояло в том, чтобы пойти с функцией друга, потому что переменные были в 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);
}
...