2011-12-23 67 views
-2

编辑ambigous来电:我张贴全班同学(条纹数的误差不相干的东西了)Visual Studio的C++来重载函数

我做了下面的类:

class packet 
{public:char * buffer; 
    int  size; 
    int  data; 

    packet(); 
    packet(packet &text, int length=-1); 
    packet(char * text, int length=-1); 
    packet(int val); 
    packet(char c); 
    packet(double d); 
    packet(float f); 

    ~packet(); 

    packet & operator=  (packet &text); 
    packet  operator+  (packet &text); 
    packet & operator+=  (packet &text); 
    packet & operator|=  (packet &text); 
    bool  operator==  (packet &text); 
    bool  operator*=  (packet &text); 
    bool  operator!=  (packet &text); 

       operator char* () const; 
       operator int () const; 
       operator float () const; 
    char  operator []  (int pos) const; 
}; 

而且我用的是类像这样:

packet p = packet(); 

return packet(); 

和Visual Studio给了我这个错误:

test.cpp(162): error C2668: 'packet::packet' : ambiguous call to overloaded function 
...packet.h(26): could be 'packet::packet(float)' 
...packet.h(23): or  'packet::packet(int)' 
...packet.h(22): or  'packet::packet(char *,int)' 

有谁知道我做错了什么?为什么这种模糊?

PS:我认为它与4个运营商在底部做的,但我对那些超载运营那种一点点朦胧......

解决方案:我得到了它的标记部分构造为工作明确:

class packet 
{public:char * buffer; 
    int  size; 
    int  data; 

    packet(); 
    packet(packet &text, int length=-1); 
    explicit packet(char * text, int length=-1); 
    explicit packet(int val); 
    explicit packet(char c); 
    explicit packet(double d); 
    explicit packet(float f); 

    ~packet(); 

    packet & operator=  (packet &text); 
    packet  operator+  (packet &text); 
    packet & operator+=  (packet &text); 
    packet & operator|=  (packet &text); 
    bool  operator==  (packet &text); 
    bool  operator*=  (packet &text); 
    bool  operator!=  (packet &text); 

       operator char* () const; 
       operator int () const; 
       operator float () const; 
    char  operator []  (int pos) const; 
}; 
+5

你确定这是你的整个代码? – 2011-12-23 16:36:28

+3

我确定它不是整个代码。我的猜测是,他正在传递'0'或'NULL'给构造函数,像'packet(0)'或'packet(NULL)'。 – Nawaz 2011-12-23 16:37:05

+1

显示实际的代码。 – 2011-12-23 16:37:18

回答

3

万一错误实际发生在您尝试将函数的结果分配给一个新变量的地方,问题可能是你的拷贝构造函数。你应该在constpacket&,以便它可以用临时对象使用:

packet(const packet & text, int length=-1); 

其他构造可能开始发挥作用,在这种情况下,如果你的类是隐式转换为intfloat ....

由于这样的问题,通常建议不要添加不必要的转换运算符并标记构造函数为explicit以避免意外的隐式转换。

+0

非常感谢,这帮助我解决了我的问题。我将几个构造函数标记为明确的,并且编译和工作! – HardCoder 2011-12-23 17:46:17

+0

请注意,如果转换运算符不在混合中(部分原因是MSVC将执行非标准操作),MSVC 2010在'/ W4'处给出了一个好消息:'C:\ temp \ test.cpp(35 ):警告C4239:使用非标准扩展:'参数':从'数据包'转换为'数据包&',非const引用只能绑定到一个左值;复制构造函数需要引用非const' – 2011-12-23 17:54:50

+1

@HardCoder:将'packet'和'''参数标记为'const'可能是个好主意。 – 2011-12-23 18:03:04