J'ai fait le programme suivantQuand avons-nous besoin d'une .template construire
#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);
}
Le programme ci-dessus doesn compile pas parce display()
est une fonction de membre de modèle afin d'une qualification de .template
avant display()
doit être fait. Ai-je raison?
Mais quand je fait le programme suivant
#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();
}
Pourquoi k.func<char>(k);
ne compile pas même après avoir donné une .template
construction?
Une réponse complète et complète à cette question peut être trouvée dans l'entrée FAQ de Comeau C++ FAQ, ["Qu'est-ce que la syntaxe' -> template', '.template' et' :: template'? "] (http://www.comeaucomputing.com/techtalk/templates/#templateprefix). –
Je suis bloqué ... §5.2.5/1 dit "Une expression postfixée suivie d'un point ou d'une flèche ->, ** suivi éventuellement du mot-clé template (14.8.1) **, suivi d'un identifiant expression, est une expression postfixée. " Mais 14.8.1 semble être sans rapport, en plus de décrire comment C++ est capable de résoudre les modèles de fonctions membres * sans * le mot-clé. Où ce mot clé est-il spécifié? – Potatoswatter
@Potatoswatter: Le mot-clé est spécifié au §2.11 Tableau 3, bien sûr. ;-) (Sur une note plus sérieuse, c'est une bonne question). –