2011-12-23 43 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