2011-01-12 67 views
16

這個錯誤信息是什麼意思?重載函數調用不明確

error: call of overloaded ‘setval(int)’ is ambiguous 
huge.cpp:18: note: candidates are: void huge::setval(unsigned int) 
huge.cpp:28: note:     void huge::setval(const char*) 

我的代碼如下所示:

#include <iostream> 
#define BYTES 8 
using namespace std ; 

class huge { 
private: 
    unsigned char data[BYTES]; 
public: 
    void setval(unsigned int); 
    void setval(const char *); 
}; 

void huge::setval(unsigned int t) { 
    for(int i = 0; i< BYTES ; i++) { 
     data[i] = t; 
     t = t >> 1; 
    } 
} 

void huge::setval(const char *s) { 
    for(int i = 0; i< BYTES ; i++) 
     data[i] = s[i]; 
} 

int main() { 
    huge p; 
    p.setval(0); 
    return 0; 
} 
+4

我想這個問題的答案將取決於你試圖調用哪個版本的函數。我可以假設,但顯然我不能肯定,除非你告訴我。這將與編譯器一起工作,我想知道...... – 2011-01-12 17:59:25

+0

@KonradRudolph字面值`0`是`unsigned int`和`const char *`的有效值。 – 2017-03-23 22:47:47

+0

@RyanP是的,我通常意識到。不知道我當時的意思。 – 2017-03-23 22:51:06

回答

17

字面0在C++中有兩個含義。
一方面,它是一個整數值爲0.
另一方面,它是一個空指針常量。

由於您的setval函數可以接受intchar*,因此編譯器無法確定您的意思。

最簡單的解決方案是將0轉換爲正確的類型。
另一種選擇是,以確保通過使另一方的模板的int過載是優選的,例如:

class huge 
{ 
private: 
    unsigned char data[BYTES]; 
public: 
    void setval(unsigned int); 
    template <class T> void setval(const T *); // not implemented 
    template <> void setval(const char*); 
}; 
1

使用

p.setval(static_cast<const char *>(0)); 

p.setval(static_cast<unsigned int>(0)); 

正如錯誤指示的0類型是int。這可以簡單地轉換爲unsigned intconst char *。通過手動進行投射,您可以告訴編譯器您想要的超載。

1

演員的值,因此編譯器知道調用哪個函數:

p.setval(static_cast<const char *>(0)); 

注意,你已經在你的代碼分段錯誤,你得到它的編譯(取決於後哪些功能你真的想叫)。

3

用以下替換p.setval(0);

const unsigned int param = 0; 
p.setval(param); 

這樣它就知道常數0是哪種類型。

2

這是不明確的,因爲指針只是一個地址,所以一個int也可以被當作一個指針 - 0(一個int)可以很容易地轉換爲unsigned int或char *。

簡而言之,就是調用p.setval(),其中明確指定了實現的類型之一:unsigned int或char *。 p.setval(0U),p.setval((unsigned int)0)和p.setval((char *)0)將全部編譯。

儘管不要在這種情況下襬脫這種情況,但通過不使用類似類型定義重載函數通常是一個好主意。

+0

對於最後一段尤其如此。 – 2011-01-12 18:04:04

12

的解決方案是很簡單的,如果我們考慮在恆定值的類型,這應該是「無符號int「而不是」int「。

相反的:

setval(0) 

用途:

setval(0u) 

後綴 「U」 告訴編譯器,這是一個無符號整數。然後,不需要轉換,呼叫將是明確的。