Vorlage partielle Spezialisierung mit mehreren template-argument-Fehler
Wenn ich templates partielle Spezialisierung auf eine Klasse mit einer template-argument, ich kann spezialisiert eine Methode wie diese:
#include <cstdlib>
template< std::size_t Dim >
class Test
{
public:
int foo();
};
template< std::size_t Dim >
inline int Test< Dim >::foo()
{
return 0;
}
template<>
inline int Test< 1 >::foo()
{
return 1;
}
int main()
{
Test< 2 > wTest2;
Test< 1 > wTest1;
wTest2.foo();
wTest1.foo();
return 0;
}
Die Methode foo ist spezialisiert für Dim = 1. Aber sobald ich ein template-argument für meine Klasse wie folgt:
#include <cstdlib>
template< typename T, std::size_t Dim >
class Test
{
public:
int foo();
};
template< typename T, std::size_t Dim >
inline int Test< T, Dim >::foo()
{
return 0;
}
template< typename T >
inline int Test< T, 1 >::foo()
{
return 1;
}
int main()
{
Test< double, 2 > wTest2;
Test< double, 1 > wTest1;
wTest2.foo();
wTest1.foo();
return 0;
}
Den compiler (von VS2010) beschwert sich mit diesen Fehlern:
1>c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(20): error C3860: template argument list following class template name must list parameters in the order used in template parameter list
1>c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(20): error C2995: 'int Test<T,Dim>::foo(void)' : function template has already been defined
1> c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(7) : see declaration of 'Test<T,Dim>::foo'
1>c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(20): error C2976: 'Test<T,Dim>' : too few template arguments
1>c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(26): error C2264: 'Test<T,Dim>::foo' : error in function definition or declaration; function not called
1> with
1> [
1> T=double,
1> Dim=2
1> ]
1>c:\documents and settings\cayouette\my documents\codelocal\testtemplatespecialization\main.cpp(27): error C2264: 'Test<T,Dim>::foo' : error in function definition or declaration; function not called
1> with
1> [
1> T=double,
1> Dim=1
1> ]
1>
1>Build FAILED.
So wie ich das sehe, gibt es keine Zweideutigkeit und der compiler sollte in der Lage sein zu beheben und alles funktioniert genau wie das argument, der Fall.
Wenn dies nicht unterstützt in C++, erläutern Sie bitte warum.
- dupe diese FAQ-Frage: stackoverflow.com/questions/1501357/...
- Danke Johannes, ich schaue stundenlang zu, dass die Art von Antwort, ohne Erfolg. Dass gesagt wird, meine Frage ist ein bisschen anders, ich Frage nach dem Grund, warum es nicht funktioniert, und so weit, ich habe nicht eine definitive Antwort.
InformationsquelleAutor Philippe Cayouette | 2011-10-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie kann nicht partiell spezialisieren Funktionen – dies umfasst auch die member-Funktionen.können Sie nur teilweise spezialisieren die ganze Klasse:(Ich habe definiert die Funktionen, die hier inline; dass es natürlich nicht nötig.)
Bearbeiten, da kann ich nicht posten, Kommentare (50 rep, heh)...
Philippe, in Antwort auf Ihren Kommentar heute morgen, nach dem standard, den Sie teilweise nicht spezialisieren, ein Mitglied einer Klasse Vorlage, Sie kann nur vollständig spezialisiert Sie (ob es eine Vorlage-Klasse, eine Funktion, ein Funktions-template, etc...). In deinem ersten Beispiel, Sie sind voll und ganz spezialisiert die member-Funktion foo. In Ihrem zweiten Beispiel, Sie sind teilweise spezialisiert, Grund, warum es nicht kompilieren. Sie können sich voll spezialisieren, es auf diese Weise:
Obwohl Konrad die codestück ist absolut legal, ich bin mir nicht sicher, der Grund, warum Philippe-code kann nicht kompiliert werden, ist richtig. (Obwohl, wie Konrad wissen, Sie kann nicht partiell spezialisieren eine Funktion Vorlage).
Die Frage auf der hand, in der Philippe-code, ist, dass wir deklarieren eine Klasse Vorlage und nicht eine Funktion Vorlage. Also, eine partielle Klasse, template-Spezialisierung-Deklaration wird benötigt für die partielle Spezialisierung definition legal sein.