错误C2593:'operator +'不明确

时间:2010-03-05 00:17:16

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

如果我有以下文件,我会收到此错误(VC9中的c2593)。 如果我在main.cpp中取消注释原型,则错误消失。我需要保持相同的功能,同时保持class不在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 个答案:

答案 0 :(得分:4)

尝试将原型放在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 :(得分:1)

该注释行应该在number.h中。

编辑:在number.h中,但作为自由函数。

答案 2 :(得分:0)

你永远不会在number.h中声明运算符+,你只能在number.cpp中定义 - 因此,当你在main.cpp中包含number.h时,它不知道去哪里找运营商+。

你必须将operator +的声明放在class.h之外的number.h中,然后在number.cpp中定义

答案 3 :(得分:0)

在您回到我们之前使用一个非常相似的问题时,还需要注意您的代码:最好删除operator intoperator 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或类似的东西。

答案 4 :(得分:0)

除了在头文件中声明operator +的其他答案之外,我建议你在你的struct中也有operator + =。

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是有效的;而不是x = x + y;

答案 5 :(得分:-1)

就个人而言,我更喜欢在类中声明运算符:

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)
{
  ...
}