2011-09-15 5 views
5

누군가 다음 코드에서 MyFooC를 인스턴스화하려고 시도하면 Foo에서 오버로드 된 생성자에 대한 모호한 호출이 발생하는 이유를 설명해 줄 수 있습니까? 내 가정은 생성자 매개 변수로 사용 된 정수가 부호없는 정수로 승격되어 해결되었지만 분명히 잘못되었습니다.오버로드 된 생성자 간 모호성

template <typename t> class Foo 
{ 
private: 
    t m_Value; 
    unsigned int m_Length; 

public: 
    Foo(const t& Value) : 
     m_Value(Value), 
     m_Length(0) 
    { 
    } 

    Foo(unsigned int Length) : 
     m_Value(static_cast<t>(0)), 
     m_Length(Length) 
    { 
    } 
}; 

int main() 
{ 
Foo<double> MyFooA(32U); 
Foo<double> MyFooB(32.0f); 
//Foo<double> MyFooC(32); 
    return 0; 
} 

답변

10

intdoubleunsigned 모두로 변환 할 수 있습니다. 둘 다 은 '확대'전환으로 간주되며 동일한 순위를가집니다. 일반적으로 규칙으로 과부하가 걸리며 과부하 중 하나가 계열 유형 인 경우 을 얻으려면 int을 오버로드하고 다른 사람이 시도 할 때 애매한 것을 피하는 것이 좋습니다. ~ 에 정수 정수를 전달하십시오.

은 BTW : 당신은 C++ 표준에서, 무엇을 의미하는지 맥락에서 분명 있지만, "승진"매우 정확한 의미를 가지고 있으며, unsigned intint의 변환을 포함하지 않습니다.

0

int는 쉽게 int를 쉽게 double로 변환 할 수 있다고 가정합니다. 필자는 암시 적 캐스팅에 대한 선호 순서를 지정하는 C++ 사양을 알고 컴파일러에서 double 또는 unsigned int가 될 수있는 int를 볼 때 호출을 모호하게 봅니다.

+0

"프로모션"이 "전환"보다 선호되므로 "char"이 주어지면'int'를 사용하는 함수가'double'을 사용하는 함수보다 선호됩니다. 그러나 C++ 표준은 "프로모션"이라는 매우 제한적인 정의를 사용합니다. 기본적으로 프로모션은 양 피연산자가 같은 유형을 갖는 이진 연산자에서 발생하는 변환입니다. (예를 들어, 두 개의 'short'를 추가하면 추가 전에 'int'로 승격됩니다.) –

+0

아, 저도 몰랐습니다. 고마워요. – Jodaka

관련 문제