2013-08-12 6 views
6

Учитывая следующий код, почему компилятор не разрешает неявное преобразование при построении Bar? То есть, строится Foo так же, как a, который был (должен) затем использоваться для построения 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

Компилятор допускает только одно неявное , определяемое пользователем.

См 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 

Построение Bar таким образом потребовалось бы два.

+4

Ваше вступительное предложение неверно. Компилятору разрешено сделать одно неявное *** пользовательское преобразование ***. Он может выполнять столько же неявных *** стандартных *** преобразований, сколько ему нравится –

+2

Мне жаль, что он не понравился. –

+1

@ArmenTsirunyan благодарит за это критическую проверку. Ответ обновлен. – zmb

Смежные вопросы