2010-05-28 78 views
3

當我將enum指定爲第二個參數時,爲什麼VisualC++(2008)會混淆'C2666:2重載有類似的轉換',但是當我定義一個bool類型時卻不會。具有類似轉換的構造函數重載

不應該類型匹配已經排除第二個構造函數,因爲它是'basic_string'類型?

#include <string> 
using namespace std; 

enum EMyEnum { mbOne, mbTwo }; 
class test { 
public: 
#if 1 // 0 = COMPILE_OK, 1 = COMPILE_FAIL 
    test(basic_string<char> myString, EMyEnum myBool2) { } 
    test(bool myBool, bool myBool2) { } 
#else 
    test(basic_string<char> myString, bool myBool2) { } 
    test(bool myBool, bool myBool2) { } 
#endif 
}; 

void testme() { 
    test("test", mbOne); 
} 

我可以通過指定一個參考'即ie。 basic_string & myString',但不是如果它是'const basic_string & myString'。

也通過「test((basic_string)」test「,mbOne)顯式調用;」也適用。

我懷疑這與每個表達式/類型通過固有的'!= 0'被解析爲bool有關。

好奇徵求意見都一樣:)

+0

重載解析的最佳描述之一可以在[C++模板:完全指南]的附錄B中找到(http://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde/dp/0201734842 )。本書其餘部分也非常出色,但該附錄提供了一個非常簡潔和易於參考的重載解析規則列表。 – 2010-05-28 01:50:42

回答

5

的原因含糊之處在於一個候選函數是不是隻如果沒有它的參數比其他參數更糟糕的比賽另一位候選人功能較好。

的問題是,字符串常量,它有一個類型的const char[5]可轉換爲兩std::string(經由轉換構造)和到bool(因爲陣列可以衰減到一個指針,並且任何指針是隱式轉換爲bool)。轉換爲bool是首選,因爲它是標準轉換,標準轉換優先於用戶定義的轉換。

所以,考慮 「破」 重載:

test(basic_string<char> myString, EMyEnum myBool2) { } // (1) 
test(bool myBool, bool myBool2) { }      // (2) 

第一個參數是一個const char[5]和偏好(2)(根據上面的描述)。第二個參數是EMyEnum並且更喜歡(1),這是完全匹配;轉換將需要匹配(2)(枚舉可以隱式轉換爲bool)。

現在考慮第二種情況:

test(basic_string<char> myString, bool myBool2) { } // (3) 
test(bool myBool, bool myBool2) { }     // (4) 

的第一個參數還是喜歡(4),但現在第二個參數可以同時匹配(3)(4)一視同仁。因此,編譯器可以選擇(4)並且沒有歧義。

會有任何含糊,如果你消除了需要轉換的第一個參數,例如,

test(basic_string<char>("test"), mbOne); 

因爲這兩個參數將完全匹配(1)

相關問題