Betrachten Sie den folgenden Code ein:Teil Vorlage Spezialisierung und icc
template <class T, class U, class V>
struct Foo { };
template <class T, class U>
struct Foo<T, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated";
}
};
template <class U>
struct Foo<double, U, std::integral_constant<int, U::value>> {
static void print()
{
std::cerr << "instantiated special";
}
};
struct Bar {
static const int value = 0;
};
int main(int argc, char ** argv)
{
using Baz = Foo<double, Bar, std::integral_constant<int, 0>>;
Baz::print();
return 0;
}
Als ich das 16.0.1 mit icc kompilieren, erhalte ich die folgende Meldung:
main.cpp(38): error: more than one partial specialization matches the template argument list of class "Foo<double, Bar, std::integral_constant<int, 0>>"
"Foo<T, U, std::integral_constant<int, U::value>>"
"Foo<double, U, std::integral_constant<int, U::value>>"
Baz::print();
Mit Klirren 3.7.1 und gcc 5.3.0 dies kompiliert (und "instanziiert special" wird gedruckt). Ist das ein Fehler in ICC oder ist mein Code falsch? Für mich ist klar, dass die zweite Spezialisierung strikter spezialisiert ist als die erste; Es ist identisch mit dem ersten, außer dass es den ersten Template-Parameter sperrt.
Edit: Ich sollte hinzufügen: Wenn dies ein Fehler in ICC ist, gibt es eine gute Problemumgehung?
Sure sieht aus wie ein Fehler in ICC zu mir. – Cameron
Könnten Sie überprüfen, ob die Vorschläge in den [Kommentare unten] (https://stackoverflow.com/questions/37216212/partial-template-specialization-and-icc#comment61972971_37216503) das Problem auf ICC beheben, bitte? Nicht eine vollständige Lösung für Ihr Problem, natürlich, nur ein Schritt vorwärts in der Untersuchung. – bogdan
In dem tatsächlichen Code stammt die Ganzzahl von einem verschachtelten Mitglied von U, das wiederum kling Probleme, so wechselte mein Kollege von Nicht-Typ zu Typ Vorlage Parameter. –