2010-05-28 6 views
3

두 번째 매개 변수로 enum을 지정할 때 'bool 유형을 정의 할 때가 아니라'C2666 : 2 오버로드가 유사한 변환을하는 경우 VisualC++ (2008)가 혼동되는 이유는 무엇입니까?열거 형, 유사한 변환을 사용하는 생성자 오버로드

두 번째 생성자가 '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'을 통해 부울로 해석되는 모든 표현식/유형과 관련이 있다고 생각합니다. 모두 같은 :

+0

[C++ Templates : The Complete Guide] (http://www.amazon.com/Templates-Complete-Guide-David-Vandevoorde/dp/0201734842)의 부록 B에서 과부하 해결에 대한 가장 좋은 설명 중 하나를 찾을 수 있습니다.). 이 책의 나머지 부분도 우수하지만, 부록에서는 매우 간단하고 과부하 해결 규칙을 쉽게 참조 할 수있는 목록을 작성합니다. –

답변

5

이유 모호성에 대한 의견이 있어요

는 하나 개의 후보 함수는 매개 변수 중 어느 것도 다른 매개 변수보다 더 일치없는 경우에만 다른 후보의 기능보다 더 나은 것입니다.

문제 const char[5]의 유형이 문자 스트링이 배열 포인터로 감쇠 할 수 있기 때문에 ((a 변환 생성자를 통해) 및 bool에 모두 std::string로 전환인지, 그리고 어떤 포인터에 내재적 컨버터블 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)을 선택할 수 있으며 모호성이 없습니다. 당신은, 예를 들어, 첫 번째 인수에 필요한 변환을 제거하면 두 인수가 정확히 (1) 일치하기 때문

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

을 모호함이 없을 것이다.