Ich nahm das folgende Beispiel aus http://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading und Klirren (3.4) scheint es ganz gut, dass Handling, während g ++ (4.8.3) einen 'mehrdeutige Überlastung' Fehler gibt:Ist g ++ bei der Überladung von Funktionsvorlagen fehlerhaft?
struct A {};
template<class T> struct B {
template<class R> void operator*(R&){ cout << "1" << endl; } // #1
};
template<class T, class R> void operator*(T&, R&) { cout << "2" << endl;} // #2
int main() {
A a;
B<A> b;
b * a; //prints 1
}
Klirren richtig drucken 1 (wie nach cppreference erwartet), während g ++ diesen Fehler gibt:
test_templates.cpp: In function ‘int main()’:
test_templates.cpp:13:5: error: ambiguous overload for ‘operator*’ (operand types are ‘B<A>’ and ‘A’)
b * a; //prints 1
^
test_templates.cpp:13:5: note: candidates are:
test_templates.cpp:7:26: note: void B<T>::operator*(R&) [with R = A; T = A]
template<class R> void operator*(R&){ cout << "1" << endl; } // #1
^
test_templates.cpp:9:33: note: void operator*(T&, R&) [with T = B<A>; R = A]
template<class T, class R> void operator*(T&, R&) { cout << "2" << endl;} // #2
Ist g ++ misbehaving eigentlich hier?
VS2012 (MSVC 11,0) berichten, dies auch als mehrdeutig – BeyelerStudios
Well Klirren-3.4.2 in meiner Box auch berichtet, dies als eindeutig. 3.5 hat es zusammengestellt. Obwohl ich nicht sicher bin, ob es viel zu beantworten gibt. Die Verbindung ist ziemlich klar. Der Operator ist nicht eindeutig, aber er sollte mit einer Teilbestellung aufgelöst werden. Nur im Standard kann man entsprechende Zitate finden. Meine Wette ist, dass cppreference richtig ist. – luk32
@ luk32 clang-3.4.2 kompiliert ok wenn '-std = C++ 11' /' -std = C++ 1y' –