Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用外部函数模板中类模板的函数模板_C++_Templates - Fatal编程技术网

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
),因为此时此信息不可用。您确实有一个,非常有趣的星座。你有一个非常非常有趣的星座。