2013-07-14 12 views
6

Rozważmy następującą klasę, która zawiera funkcję konwersji dla typu std :: string:Dlaczego funkcja konwersji nie działa ze std :: string?

class SomeType 
{ 
    public: 

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

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

    private: 
    char *_str; 
}; 

Poniższy urywek zawiedzie skompilować z błędem: brak operatora „==” pasuje do tych argumentów

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

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

    return 0; 
} 

Zdaję sobie sprawę, że mogę zdefiniować operatora == metodę, która akceptuje operand std :: string, ale dlaczego funkcja konwersji nie działa?

+0

jaki jest błąd? –

+1

@Aniket Wystąpił błąd. –

+0

Jeśli którakolwiek z tych odpowiedzi była pomocna, zaakceptuj ją. – Borgleader

Odpowiedz

8

Problem polega na tym, że std :: string jest w rzeczywistości szablonem i jako taki wyobrażam sobie, że operator porównania jest również szablonem. I w tym przypadku standard, jaki sobie przypominam, stwierdza, że ​​nie nastąpi żadna niejawna konwersja dla wymaganych argumentów, co oznacza, że ​​musisz rzucić SomeType, aby samemu się przyłączyć, aby został wywołany.

Jak wskazano w pkt 46 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. [...]

można znaleźć więcej informacji here.

+0

Świetna odpowiedź, dziękuję za wgląd. – Julius

4

std::string jest rzeczywiście typedef do std::basic_string<char, i_do_not_remember>

nie ma operator == że dostać tylko std::string To jeden szablon

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

Ale rodzaje szablonów nie można wywnioskować tutaj. Możesz rzucić to ręcznie:

if (static_cast<std::string>(a) == std::string("test")) 
Powiązane problemy