W poniższym kodzie spodziewam się błędu kompilatora, jeśli z powodu niejednoznaczności zdefiniowano więcej niż jednego operatora rzutowania.Pierwszeństwo przeładowanych operatorów obsady
#include <iostream>
#include <sstream>
struct A
{
operator const char*() { return "hello world\n"; }
operator float() { return 123.0F; }
//operator int() { return 49; }
};
int main()
{
A a;
std::stringstream ss;
ss << a;
std::cout << ss.str();
return 0;
}
Zamiast tego, jak długo tylko jeden operator numeryczny obsada jest definiowany następnie kompiluje bez błędów, bez ostrzeżenia, a obsada numeryczna jest używana w odniesieniu do operator const char *()
. Kolejność deklarowanych operatorów nie ma znaczenia.
Jednak jeśli operator int()
i operator float()
są zarówno zdefiniowane potem dostać czego oczekiwałem od początku:
'operator <<' is ambiguous
Czy istnieją zasady pierwszeństwa dla odlewów, albo dlaczego kompilator wybrać obsadę numeryczną domyślnie? Rozumiem, że powinienem wyraźnie określić, co mam na myśli, ale moje pytanie jest na domyślny wybór, który kompilator robi.
Edycja: przy użyciu kompilatora MSVC 2010
Nie będę polegał na tym, że istnieje pierwszeństwo. Wpisz, co masz na myśli. Po prostu użyj wyraźnej obsady. 'ss << static_cast (a);' –
andre
Złożyłem swój przykład, a g ++ daje mi "błąd: niejednoznaczne przeciążenie dla" operatora << "w" ss << a "". Tak więc przynajmniej g ++ działa zgodnie z oczekiwaniami. –
Wygląda na to, że zależy to od kompilatora. Który kompilator używasz? – SztupY