2013-08-12 43 views
6

Với mã sau đây, tại sao trình biên dịch không giải quyết được chuyển đổi ngầm khi xây dựng Bar? Tức là, hãy xây dựng Foo giống như a được xây dựng, cái nào (nên) sau đó được sử dụng để xây dựng Bar?Chuyển đổi ngầm định trong 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

Đó là một phần của chuyển đổi tiêu chuẩn, tiềm ẩn không thể bị xâu chuỗi như vậy. Bạn chỉ có thể có một chuyển đổi tiềm ẩn. – IronMensan

Trả lời

9

Bạn không được phép nhiều hơn một người dùng xác định chuyển đổi ngầm định. Ví dụ Foo liên quan đến một ví dụ Bar liên quan đến hai.

4

Trình biên dịch chỉ được phép thực hiện một thao tác đơn lẻ do người dùng xác định chuyển đổi.

Xem http://en.cppreference.com/w/cpp/language/implicit_cast

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

Xây dựng Bar như vậy sẽ đòi hỏi hai.

+4

Câu mở đầu của bạn không đúng. Trình biên dịch được phép thực hiện một chuyển đổi *** đơn thuần do người dùng định nghĩa. Nó có thể thực hiện nhiều chuyển đổi *** tiêu chuẩn tiềm ẩn vì nó thích –

+2

Tôi muốn nó không thích. –

+1

@ArmenTsirunyan cảm ơn vì đã chỉ ra sự giám sát quan trọng này. Đã cập nhật câu trả lời. – zmb

Các vấn đề liên quan