ошибка C2593: «оператор +» неоднозначен - PullRequest
0 голосов
/ 05 марта 2010

Если у меня есть следующие файлы, я получаю эту ошибку (c2593 в VC9). Если я откомментирую прототип в main.cpp, ошибка исчезнет. Мне нужно поддерживать ту же функциональность, сохраняя класс вне main.cpp. Как я могу это сделать?

Спасибо.

main.cpp:

#include "number.h"

//const Number operator + (const Number & lhs, const Number & rhs);

int main(void)
{
    Number n1(2);       // n1 = 2
    Number n2(9,3);     // n2 = 3
    Number n3 = n1+n2;  // n3 = 5
}

number.h:

struct Number
{
    int num;
    Number(int n=0,int d=1) {num = n/d;}
    operator int() {return num;}
    operator double() {return num*1.0;}
};

number.cpp:

#include "Number.h"

const Number operator + (const Number & lhs, const Number & rhs)
{
Number tmp;
tmp.num = lhs.num + rhs.num;
return tmp;
}

Ответы [ 6 ]

4 голосов
/ 05 марта 2010

Попробуйте поместить прототип в файл заголовка Number:

number.h:

struct Number
{
    int num;
    Number(int n=0,int d=1) {num = n/d;}
    operator int() {return num;}
    operator double() {return num*1.0;}
};

const Number operator + (const Number & lhs, const Number & rhs);

number.cpp:

#include "Number.h"

const Number operator + (const Number & lhs, const Number & rhs)
{
Number tmp;
tmp.num = lhs.num + rhs.num;
return tmp;
}

main.cpp:

#include "number.h"

int main(void)
{
    Number n1(2);       // n1 = 2
    Number n2(9,3);     // n2 = 3
    Number n3 = n1+n2;  // n3 = 5
}
1 голос
/ 05 марта 2010

Эта закомментированная строка должна идти в числе.h

РЕДАКТИРОВАТЬ: в number.h, но в качестве свободной функции.

0 голосов
/ 05 марта 2010

Помимо ответов других на объявление оператора + в заголовочном файле, я предлагаю вам также иметь оператор + = в вашей структуре.

struct Number
{
// your other declarations.
Number& operator+=(const Number& other)
{
   this->num += other.num;
   return *this;
}
};

const Number operator+(const Number& lhs, const Number& rhs)
{
    Number ret(lhs);
    ret += rhs;
    return ret;
}

Таким образом, эффективно вызывать x + = y; вместо х = х + у;

0 голосов
/ 05 марта 2010

Лично мне больше нравится объявлять операторы внутри класса:

struct Number
{
    int num;
    Number(int n=0,int d=1) {num = n/d;}
    operator int() {return num;}
    operator double() {return num*1.0;}
    Number operator+(const Number &arg) const;
};

и затем:

Number Number::operator+(const Number &arg)
{
  ...
}
0 голосов
/ 05 марта 2010

Еще одна вещь, которую следует отметить с вашим кодом, прежде чем вернуться к нам с очень похожим вопросом: лучше убрать функции operator int и operator double. Они вызовут у вас сильную головную боль. Давайте сделаем несколько примеров:

Number a, b;

1 + b;
// ambiguous: operator+(int, int) or 
//            operator+(Number, Number) ?

// did you intend to use those for this case?
float x = a; 
// ambiguous: from int -> float or
//                 double -> float ?

В исходной ситуации у вас сложение было неоднозначным, потому что были рассмотрены встроенные операторы operator+(double, double) и operator+(int, int), и они были одинаково хороши. Другие решили эту проблему. Но прежде чем начать и столкнуться с этими другими проблемами, лучше удалите функции преобразования и вставьте явные функции, такие как asDouble или что-то подобное.

0 голосов
/ 05 марта 2010

Вы никогда не объявляете оператор + в number.h, вы только определяете его в number.cpp - поэтому, когда вы включаете number.h в main.cpp, это не знаю, куда идти, чтобы найти оператора +.

Вы должны поместить объявление оператора + в number.h вне класса, а затем определить его в number.cpp

...