【发布时间】:2011-03-30 18:30:23
【问题描述】:
我做了以下程序
#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);
}
上述程序无法编译,因为display() 是模板成员函数,因此必须在display() 之前进行.template 的限定。我说的对吗?
但是当我制作了以下程序时
#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();
}
为什么k.func<char>(k); 在给出.template 构造后仍无法编译?
【问题讨论】:
-
可以在 Comeau C++ 模板常见问题解答条目"What is the
->template,.templateand::templatesyntax about?" 中找到此问题的完整答案。 -
我被卡住了... §5.2.5/1 说“后缀表达式后跟一个点 . 或箭头 ->,可选地后跟关键字模板 (14.8.1),然后是一个 id 表达式,是一个后缀表达式。”但是 14.8.1 似乎是无关的,除了描述 C++ 如何能够解析成员函数模板没有关键字。这个关键字在哪里指定?
-
@Potatoswatter:关键字在 §2.11 表 3 中指定,当然。 ;-)(更严肃地说,这是一个好问题)。
标签: c++ templates member-functions