Der folgende Code druckt:Mixing Template-Funktion Überlastung und Vererbung
generic
overload
Aber was ich wollte, ist, dass die Überlastung oder die Spezialisierung in beiden Fällen genannt wurden, nicht die generische ein. Ich versuche nicht, Überladung mit Template-Spezialisierung zu mischen, sie sind hier zusammen, weil keiner so funktioniert hat, wie ich es erwartet habe. Gibt es irgendeine Vorlage Magie, um dies zu erreichen?
#include <iostream>
class Interface {};
class Impl: public Interface {};
class Bar
{
public:
template<typename T> void foo(T& t) {
std::cout << "generic\n";
}
void foo(Interface& t) {
std::cout << "overload\n";
}
};
template<> void Bar::foo<Interface>(Interface& t) {
std::cout << "specialization\n";
}
int main() {
Bar bar;
Impl impl;
Interface& interface = impl;
bar.foo(impl);
bar.foo(interface);
return 0;
}
Als ich diesen Code zum ersten Mal anschaute, dachte ich, er sei aus den gleichen Gründen schlecht geformt, weil der GCC denkt, er sei schlecht geformt. Aber auf einen zweiten Gedanken, ich denke, dass dies auf das Nicht-Template auflösen sollte, weil Nicht-Template-Funktionen eine bessere Übereinstimmung als Funktion Template Spezialisierungen sind, wenn alles andere gleich ist –
@Johannes: Kennen Sie eine Lösung? –
Nein, bitte ignorieren Sie meinen obigen Kommentar: Es ist nicht wahr, denn "wenn alles andere gleich ist" sollte sagen "wenn das Nicht-Template keine schlechtere Konvertierung für einen seiner Parameter hat und das Template keine bessere Konvertierung für einen seiner Parameter hat ". So, wie mein allererster Kommentar sagte, ist dies ein Kreuz: http://stackoverflow.com/questions/3519282/why-is-ist-ambiguity-here/3525172#3525172, und GCC ist korrekt. –