2013-08-12 21 views
6

Dato il seguente codice, perché il compilatore non risolve la conversione implicita durante la costruzione di Bar? Cioè, la costruzione Foo come è stata costruita a che è (dovrebbe) quindi essere usata per costruire Bar?Conversioni implicite in 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

È parte delle conversioni implicite standard, non può essere incatenato in questo modo. Puoi avere solo una conversione implicita. – IronMensan

risposta

9

Non è consentita più di una conversione implicita definita dall'utente. L'esempio Foo comprende uno, l'esempio Bar ne prevede due.

4

Il compilatore è autorizzato a eseguire una sola conversione implicita definita dall'utente.

Vedi 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 

Costruire Bar in quel modo avrebbe richiesto due.

+4

La tua frase di apertura non è corretta. Il compilatore è autorizzato a eseguire una singola conversione *** *** implicita ***. Può eseguire il maggior numero di conversioni *** *** implicite *** come piace –

+2

Vorrei che non piacesse nessuno. –

+1

@ArmenTsirunyan ringrazia per aver sottolineato questa supervisione critica. Risposta aggiornata – zmb

Problemi correlati