为什么我不能从模板化函数中调用模板化类的模板化方法

时间:2011-07-21 09:12:32

标签: c++ templates

  

可能重复:
  Confusing Template error

我有一个带有模板化方法的模板化类。 现在我有另一个函数,有2个模板参数创建带有第一个模板参数的类,并用第二个函数调用函数。 考虑这个例子:

template<class S>
class A {
public:
    template<class T>
            T f1() {
                    return (T)0.0;
            }

};

template<class T,class CT>
void function() {
    A<T> a;
    a.f1<CT>(); // gcc error in this line
}

gcc告诉我:

error: expected primary-expression before ‘>’ toke

在上面标出的行中。为什么这不起作用,我该如何解决? 谢谢! 森

2 个答案:

答案 0 :(得分:10)

A<T>依赖类型(即它取决于模板参数T),因此您必须指定您指的是模板成员:< / p>

a.template f1<CT>();

答案 1 :(得分:5)

你可以,但你需要帮助编译器。

因为a具有依赖类型,所以编译器不能假设a.f1引用的内容。它可以是一个类型,一个常量,一个函数......无论如何。

由于模板语法使用<,因此很容易与operator<混淆。

因此,标准要求您消除依赖类型中元素的性质。这适用于:

  • 类型,使用typename,例如typedef typename A<T>::SomeType type;
  • 功能,使用template,例如a.template f1<CT>();

可以说,由于已知CT是一种类型,这种消歧是没有意义的,但当涉及将函数作为类型参数传递时,事情会变得毛茸茸。

例如,a.f1<CT()>();可以解释为:

  • 使用a.f1
  • 比较CT和默认构建的operator<
  • 使用a.f1作为模板参数
  • 致电CT()

C ++语法是(一次)统一,并且在所有情况下都需要消除歧义。

质量编译器会在您理解构造时向您建议适当的修复。