Hier habe ich eine Klassenvorlage Foo definieren, spezialisieren seine Member-Funktion, und dann eine partielle Spezialisierung für diese Klasse liefern:etwas verwirrend über Klassenschablonen-Teil Spezialisierung & Klassen Mitglied Spezialisierung
// this is Foo_0
template<typename T, typename S>
class Foo {
public:
void operator()() {
std::cout << "Foo_0\n";
}
template<typename R>
void bar(R) {
std::cout << "I'm from Foo_0\n";
}
};
template<>
template<>
void Foo<double, int>::bar(double) {
std::cout << "Now I'm specialized!\n";
}
// this is Foo_1
template<typename T>
class Foo<T, int> {
public:
void operator()() {
std::cout << "Foo_1\n";
}
};
Und ich instanziiert Foo auf VS2015 wie folgt aus:
Überraschenderweise f() prints "Foo_0", die die Teilfachschablone foo_1 Einrichtung nicht gewählt. Was noch seltsamer ist, wenn ich die Spezialisierung von Foo :: bar (double) kommentiere, f() druckt "Foo_1"!
Dann ist dieses Ich teste:
Foo<int, int> f;
f();
Diesmal f() auch prints "foo_1", wird die Klasse Spezialisierung angewendet.
So scheint es, dass die Spezialisierung von member bar() die Anwendung der partiellen Spezialisierung der Klassenvorlage beeinflussen. Ist das wahr? Warum funktioniert das so?
Versuchen Sie, die explizite Funktionsvorlagenspezialisierung unterhalb der partiellen Klassenvorlagenspezialisierung zu verschieben. –
@Kerrek SB Wenn ich es verschiebe, beschwert sich der Compiler, dass "Klasse Foo nicht Mitglied Bar" hat, scheint es, dass bar (double) als Mitglied von Foo_1 betrachtet wird. – Dardai
gcc gelingt es, das Problem zu diagnostizieren (im Gegensatz zu Klängen) [Demo] (http://coliru.stacked-crooked.com/a/ed9bb1a4e9682621). ('Fehler: Teilspezialisierung von 'Klasse Foo' nach Instanziierung von 'Klasse Foo ' [-fpermissive]') –
Jarod42