簡體   English   中英

枚舉,構造函數重載具有類似的轉換

[英]Enums, Constructor overloads with similar conversions

當我將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);
}

我可以通過指定引用來解決這個問題。 basic_string&myString'但不是'const basic_string&myString'。

也通過“test((basic_string)”test“,mbOne”顯式調用;“ 也有效。

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

好奇的評論都一樣:)

模糊性的原因是,只有當一個候選函數的參數都不比另一個參數更差時,它才優於另一個候選函數。

問題是字符串文字,其類型為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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM