Wpis z mikrobloga

Ktoś mi wytłumaczy dlaczego jak wcześniej przeciążałem operator konwersji z mojej klasy na stringa, wszystko działało xD i kompilator nie miał nic przeciwko, a teraz po kilku godzinach nagle wywala mi komunikat :
_**"ambigous conversion for C-style cast from 'String' to 'std::__cxxx..."**

String to moja własna klasa będąca mniej czy więcej odwzorowaniem klasy string z biblioteki.
W klasie mam napisaną metodę przeciążającą operator konwersji ( jawny operator konwersji do std::string):

explicit operator std::string() const {
string tmp;
for(int i=0; i<= this->size_of_text; i++){
tmp+=this->text[i];
}
return tmp;
}
Iiiii wcześniej przy np:

String s2="abcd";
string a=(string) s2;
wszystko śmigało, zakomentowałem sobie ten kod, po chwili przypadkiem od komentowałem iiii się okazuje, że nagle dla kompilatora jest to już be ()

#programowanie #cpp #cplusplus
  • 15
@SirKir: string był dodany jeszcze przed tym :/ No naprawdę nie rozumiem... Wszystko działało nic nie zmieniałem, nawet programu nie resetowałem... i nagle boom kompilator mówi "you shall not pass!" XD
edit. próbowałem nawet wszystkie biblioteki wywalić i zostawić tylko iostream i dalej to samo :(
@OstryKepucz: https://en.cppreference.com/w/cpp/string/basic_string/operator%3D

Jak dla mnie chodzi o to, że std::string ma kilka operatorów= zdefiniowanych, m.in. z charów i std::stringa. Twój typ ma konwersję do charów i do std::stringa. Kompilator nie wie, którą ścieżkę wybrać.

A "wcześniej działało", bo pewnie nie przekompilowałeś całego, albo nie zapisałeś zmian przed przekompilowaniem, albo zapomniałeś, że nie działało :)

PS ogólnie to rozumiem, że ten kod jest do nauki operatorów. Bo w prawdziwym życiu kombinowanie z
@tell_me_more: o kurcze rzeczywiście operator const char* był wcześniej z błędem i naprawiłem go później i to on miesza ( ͠° ͟ل͜ ͡°). To teraz kolejne pytanie jak to ominąć? :/
Edit. wystarczyło "wyłączyć" niejawną konwersję przez explicit dla konwersji do const chara ( ͡° ͜ʖ ͡°)
@OstryKepucz: ogólnie IMHO przedefiniowanie operatorów to code smell, powinno się to robić w ostateczności. A już szczególnie nie należy ruszać operatorów rzutowania. Przedefiniowanie operatorów rzutowania to świetny sposób na to, żeby Twój kod robił 5 różnych rzeczy w tle, których się nie spodziewasz.
@OstryKepucz: @tell_me_more: Tak, bo to operator const char*() powinien być przede wszystkim explicit.
Z reguły jest masz operator bool() to wszystko, co się implicit do niego konwertuje powinno być explicit.

Dziwne trochę, że u mnie na clangu to działa bez problemu, a co ciekawe przy GCC tylko od C++17.
@lionbest: masz na swojej klasie operator rzutowania do boola. Porównujesz 2 elementy tej klasy. Nie masz operatora==. I kod typu:

MojString haslo("TAJNE_HASLO");
MojString wartoscZBazy = pobierzZBazy();
...
if (haslo == wartoscZBazy) { wystrzelRakiety(); }

wchodzi do ifa niezaleznie od hasla, bo skonwertował sobie oba na boola (a skoro oba są niepuste to oba są true bo tak "dla wygody" zdefiniowałeś operator na boola).

Nie, dzięki. Explicit is better than implicit jak