Ich habe das folgende ProgrammWann brauchen wir ein .template
#include <iostream>
#include <typeinfo>
template<class T>
struct Class
{
template<class U>
void display(){
std::cout<<typeid(U).name()<<std::endl;
return ;
}
};
template<class T,class U>
void func(Class<T>k)
{
k.display<U>();
}
int main()
{
Class<int> d;
func<int,double>(d);
}
Das obige Programm doesn nicht kompiliert, da display()
eine Template-Elementfunktion ist so eine Qualifikation von .template
vor display()
muss getan werden. Habe ich recht?
Aber wenn ich mache das folgende Programm
#include <iostream>
#include <typeinfo>
template<typename T>
class myClass
{
T dummy;
/*******/
public:
template<typename U>
void func(myClass<U> obj);
};
template<typename T>
template<typename U>
void myClass<T>::func(myClass<U> obj)
{
std::cout<<typeid(obj).name()<<std::endl;
}
template<class T,class U>
void func2(myClass<T>k)
{
k.template func<U>(k); //even it does not compile
}
int main()
{
myClass<char> d;
func2<char,int>(d);
std::cin.get();
}
Warum k.func<char>(k);
nicht einmal kompilieren, nachdem ein .template
Konstrukt zu geben?
Eine vollständige Antwort auf diese Frage finden Sie im Comeau C++ - Vorlagen-FAQ-Eintrag, ["Was ist das' -> Template', '.template' und' :: template' Syntax über? "] (http://www.comeaucomputing.com/techtalk/templates/#templateprefix). –
Ich stecke fest ... §5.2.5/1 sagt "Ein Postfix Ausdruck gefolgt von einem Punkt. Oder einem Pfeil ->, ** optional gefolgt von der Schlüsselwort Vorlage (14.8.1) **, gefolgt von einer ID -expression, ist ein Postfix-Ausdruck. " Aber 14.8.1 scheint nicht verwandt zu sein, abgesehen davon, dass beschrieben wird, wie C++ Memberfunktionsvorlagen * ohne * das Schlüsselwort auflösen kann. Wo wird dieses Keyword angegeben? – Potatoswatter
@Potatoswatter: Das Schlüsselwort ist natürlich in §2.11 Tabelle 3 angegeben. ;-) (Auf eine ernstere Anmerkung, das ist eine gute Frage). –