2013-07-14 8 views
6

Betrachten Sie die folgende Klasse, die eine Konvertierungsfunktion für die std :: string-Typ enthält:Warum funktioniert eine Konvertierungsfunktion nicht mit std :: string?

class SomeType 
{ 
    public: 

    SomeType(char *value) 
    { 
     _str = value; 
    } 

    operator std::string() 
    { 
     return std::string(_str); 
    } 

    private: 
    char *_str; 
}; 

Der folgende Ausschnitt schlägt mit dem Fehler zu kompilieren: kein Operator „==“ passt diese Operanden

int main(int argc, char* argv[]) 
{ 
    SomeType a("test"); 

    if (a == std::string("test")) // ERROR on this line 
    { 
     int debug = 1; 
    } 

    return 0; 
} 

Ich weiß, ich könnte eine Operator == Methode, die std :: String Operand akzeptiert, aber warum funktioniert die Konvertierung Funktion nicht?

+0

Was ist der Fehler? –

+1

@Aniket Der Fehler ist in der Frage. –

+0

Wenn eine dieser Antworten hilfreich war, nehmen Sie bitte eine an. – Borgleader

Antwort

8

Das Problem ist, dass std :: string in der Tat ist eine Vorlage, und als solche Ich stelle mir vor, dass es den Vergleichsoperator ist auch eine Vorlage. Und in diesem Fall sagt der Standard, wie ich mich erinnere, dass für die erforderlichen Argumente keine implizite Konvertierung stattfindet, was bedeutet, dass Sie SomeType in eine Zeichenfolge umwandeln müssen, damit sie aufgerufen wird.

Als 46 von Effective C in Artikel angegeben ++:

[...], because implicit type conversions are never considered during template argument deduction. Never. Such conversions are used during function calls, yes, but before you can call a function, you have to know which functions exist. [...]

Sie here weitere Informationen finden können.

+0

Große Antwort, danke für die Einsicht. – Julius

4

std::string ist eigentlich typedef std::basic_string<char, i_do_not_remember>

Es gibt keine operator ==, die gerade std::string bekommen Es ist Vorlage eines

template<...> 
bool operator (basic_string<...>& a, basic_string<...>& b) { 
    // 
} 

Aber Template-Typen können hier nicht abgeleitet werden. Sie können es manuell Stimmen:

if (static_cast<std::string>(a) == std::string("test")) 
Verwandte Themen