2013-08-12 3 views
6

다음 코드가 주어지면 Bar을 생성 할 때 컴파일러에서 암시 적 변환을 해결하지 않는 이유는 무엇입니까? 즉, a과 같이 구성 Foo을 구성한 다음 구성해야만합니다 (Bar?C++의 암시 적 변환

#include <string> 

class ImplicitlyConvertToChar 
{ 
public: 
    ImplicitlyConvertToChar(const char* a_char) 
    : m_string(a_char) 
    { } 

    ImplicitlyConvertToChar(const char* a_char, size_t a_end) 
    : m_string(a_char) 
    { 
    } 

    template <typename T_String> 
    ImplicitlyConvertToChar(T_String const& a_string) 
    : m_string(a_string.begin()) 
    { 
    } 

    operator char const *() const 
    { return m_string; } 

    const char* m_string; 
}; 

class Foo 
{ 
public: 

    Foo(const ImplicitlyConvertToChar& a_charLike) 
    : m_string(a_charLike) 
    { } 

    const char* m_string; 
}; 

class Bar 
{ 
public: 
    Bar(const Foo& a_foo) 
    : m_foo(a_foo) 
    { } 

    Foo m_foo; 
}; 

int main() 
{ 
    Foo a("this works"); 
    Bar b("Why doesn't this?"); 
} 
+0

표준의 일부이므로 암시 적 변환을 그렇게 연결할 수 없습니다. 암시 적 변환은 하나만 가능합니다. – IronMensan

답변

9

사용자 정의 암시 적 변환은 둘 이상 허용되지 않습니다. 예를 들어 Foo에는 하나가 포함되며, Bar에는 두 개가 포함됩니다.

4

컴파일러는 암시 적으로 사용자 정의 변환 만 허용합니다.

A user-defined conversion consists of: 
    zero or one non-explicit single-argument constructor or non-explicit 
    conversion function calls 

http://en.cppreference.com/w/cpp/language/implicit_cast 두를 필요로 그렇게 Bar 구축을 참조하십시오.

+4

시작 문장이 올바르지 않습니다. 컴파일러는 *** 암시 적 *** 사용자 정의 *** 변환을 하나만 허용합니다. 그것은 암시적인 *** 표준 *** 변환을 좋아할 때 수행 할 수 있습니다. –

+2

아무 것도 좋아하지 않았 으면 좋겠어요. –

+1

@ArmenTsirunyan이 중요한 감독을 지적 해 주셔서 감사합니다. 답변이 업데이트되었습니다. – zmb