C++ 调用外部函数模板中类模板的函数模板
可能重复:C++ 调用外部函数模板中类模板的函数模板,c++,templates,C++,Templates,可能重复: 我有以下几个星座: template<typename T> class A{ template<typename U> A<U> f()const; } template<typename T, typename U> A<U> F(const A<T> &I) { return I.f<U>();//this does not work } 模板 甲级{ 模板 f()常
我有以下几个星座:
template<typename T>
class A{
template<typename U>
A<U> f()const;
}
template<typename T, typename U>
A<U> F(const A<T> &I)
{
return I.f<U>();//this does not work
}
模板
甲级{
模板
f()常数;
}
模板
A F(常数A&I)
{
return I.f();//这不起作用
}
标记行上的编译器错误为:
错误:在'>'标记之前需要初始值设定项
那么如何正确地写这行呢?试试以下方法:
return I.template f<U>();
返回I.template f();
试试这个:
return I.template f<U>();
返回I.template f();
这是两个阶段的查找。这样做:
I.template f<U>();
I.template f();
这是必要的,因为当编译器编译函数模板
F()
时,它不知道可以用什么T
实例化它<在定义了F()
之后,code>A可以被专门化,这只有在实际实例化F()
时才知道。因此,当编译器遇到它的定义时,I.f这是两阶段查找。这样做:
I.template f<U>();
I.template f();
这是必要的,因为当编译器编译函数模板F()
时,它不知道可以用什么T
实例化它<在定义了F()
之后,code>A
可以被专门化,这只有在实际实例化F()
时才知道。因此,当编译器遇到它的定义时,I.fShame on me我在这里发布之前,我读了几个线程,但没有将它与我的问题联系起来。或者,用更少的话来说,您需要告诉编译器名称“f
”是一个值(不说什么)、一个类型名(说typename
)还是一个模板(说template
),因为这个信息在那个时候是不可用的。真不好意思,我在这里发布之前读了好几篇文章,但并没有把它和我的问题联系起来。或者,简而言之,您需要告诉编译器名称“f
”是一个值(不说什么)、一个类型名(说typename
)还是一个模板(说template
),因为此时此信息不可用。您确实有一个,非常有趣的星座。你有一个非常非常有趣的星座。