我做了以下程序我们什么时候需要一个.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);
}
上述程序中,没有按无法编译,因为display()
是一个模板成员函数等等的.template
display()
前的资格必须做到的。我对吗?
但是当我做了下面的程序
#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++ Templates FAQ条目中找到[“什么是模板','.template'和':: template'语法?]] (http://www.comeaucomputing.com/techtalk/templates/#templateprefix)。 – 2010-08-17 03:52:56
我被卡住了...§5.2.5/ 1说“后缀表达式后面跟着一个点或一个箭头 - >,**(可选)后跟关键字模板(14.8.1)**,然后跟着一个id -expression,是一个后缀表达式。“但是除了描述C++如何在没有关键字的情况下能够解析成员函数模板之外,14.8.1似乎是不相关的。此关键字在哪里指定? – Potatoswatter 2010-08-17 04:01:30
@Patatoswatter:当然,关键字在§2.11表3中有详细说明。 ;-)(更严肃的说,这是一个很好的问题)。 – 2010-08-18 04:07:06