2

Der folgende Code funktioniert nicht, es gibt eine Fehlermeldung "Zu wenig Vorlage Argumente für Struct Foo" und ich verstehe nicht warum. Mir scheint, dass der Code gültig sein sollte. Ich habe einen Auszug aus der CPP-Referenz here im Abschnitt "Die Argumentliste", Absatz 4 gefunden, der erklären könnte, warum es nicht funktioniert, aber ich verstehe es nicht.Partielle Template-Spezialisierung von Nicht-Typ-Argument nicht erlaubt

template<int a, int b, int c> struct foo { }; 
template<int a> struct foo<a, 0, 0> { }; 

int main() 
{ 
    foo<1> f; 
} 

Antwort

1

Es ist nicht wie Template-Spezialisierung funktioniert. Sie müssen * alle Argumente angeben.
* (Außer wenn Sie Standardargumente (siehe @ Storyteller Antwort) oder wenn C++ 17 Argument Abzug tritt in, aber beide gelten hier nicht.)

Hier ist eine kleine Demo:

#include <iostream> 

template<int a, int b, int c> struct foo { void bar() {std::cout << "1\n";} }; 
template<int a> struct foo<a, 0, 0> { void bar() {std::cout << "2\n";} }; 

int main() 
{ 
    foo<1, 2, 3> a; 
    foo<4, 0, 0> b; 
    a.bar(); // prints 1 
    b.bar(); // prints 2 
} 
+0

Ich verstehe. Mein Missverständnis ist jetzt klar. – BananyaDev

4

Es ist erlaubt. Aber deine Vorlage benötigt 3 Parameter. Spezialisierung macht es nicht magisch zu einer 1-Parameter-Vorlage.

Sie können die anderen Parameter machen Standardargumente haben jedoch:

template<int a, int b = 0, int c = 0> struct foo { char _[1] ; }; 
template<int a> struct foo<a, 0, 0> { char _[10] ;}; 

int main() { 
    static_assert(sizeof(foo<1>) > sizeof(foo<1, 1, 1>), ""); 
    return 0; 
} 
+0

Ist nicht die Idee der Spezialisierung, die ich jetzt es wie foo <1> statt <1, 0, 0> von foo anrufen können? – BananyaDev

+0

@BananyaDev - Nein. Bei der Spezialisierung geht es darum, das Verhalten für einen bestimmten Parametersatz zu steuern. Es ändert nicht, wie viele Parameter Sie übergeben müssen. – StoryTeller

+1

@BananyaDev - Es gibt jedoch die Möglichkeit, Standardargumente für die Parameter hinzuzufügen. – StoryTeller

1

Beachten Sie, dass die primäre Vorlage 3 Template-Parameter nimmt. Dann müssen Sie alle angeben. z.B.

foo<1, 0, 0> f; // the partial specification is used 
Verwandte Themen