2013-07-14 13 views
6

Si consideri la seguente classe che contiene una funzione di conversione per il tipo std :: string:Perché una funzione di conversione non funziona con std :: string?

class SomeType 
{ 
    public: 

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

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

    private: 
    char *_str; 
}; 

Il seguente frammento non riesce a compilare con l'errore: nessun operatore "==" partite questi operandi

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

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

    return 0; 
} 

Mi rendo conto che potrei definire un operatore == metodo che accetta l'operando std :: string, ma perché la funzione di conversione non funziona?

+0

qual è l'errore? –

+1

@Aniket L'errore è nella domanda. –

+0

Se una di queste risposte è stata utile, si prega di accettarne una. – Borgleader

risposta

8

Il problema è che std :: string è di fatto un modello e come tale immagino che è operatore di confronto è anche un modello. E in tal caso lo standard, come ricordo, afferma che non ci sarà alcuna conversione implicita per gli argomenti richiesti, il che significa che dovresti lanciare SomeType per stringere te stesso affinché venga chiamato.

Come indicato al punto 46 del Effective C++:

[...], 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. [...]

È possibile trovare maggiori informazioni here.

+0

Ottima risposta, grazie per l'intuizione. – Julius

4

std::string è in realtà typedef per std::basic_string<char, i_do_not_remember>

Non senza operator == che ottiene appena std::string E 'modello di una

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

Ma tipi di modello non può essere dedotto qui. Puoi lanciare manualmente:

if (static_cast<std::string>(a) == std::string("test")) 
Problemi correlati