为什么我会收到错误"非模板' f'用作模板"

时间:2012-10-18 16:23:49

标签: c++ templates struct

我正在尝试了解使用templatetypename的位置,我遇到了一个我无法解决的问题。我有一个模板函数f<T>,它使用传递给它的类型(它将是一个类)来调用template-member-function .f<T>。我认为我在函数体中使用typename是正确的,但是,我不断收到以下错误:

  

source.cpp:在函数'void f()'中:
  source.cpp:11:19:错误:非模板'f'用作模板
  source.cpp:11:19:注意:使用'typename T::C::template f'表示它是模板

struct A {
  struct C {
     template <typename T> void f() {}
  };
};

template <typename T> void f() {

  typename T::C::f<int>();

}

int main() {

  f<A>();

}

请注意它建议使用'typename T::C::template f'的最后一个错误。所以我按照以下方式做了以下改变:

// ...
typename T::C::template f<int>();
// ...

我按照说法做了,但后来收到了下一行错误:

  

错误:'f'

中没有名为'struct A::C'的类模板

我认为此错误不正确,因为 实际上是f中名为struct A::C的公共模板函数。我在这里做错了什么?

1 个答案:

答案 0 :(得分:3)

假设我们使f static因此可以在没有实例的情况下调用它,您不需要typename,因为您没有使用依赖类型创建任何歧义(即{ {1}}不能是变量,因为您刚刚使用C。这是正确的语法:

::

如果您不想将其设为静态,请创建struct A { struct C { template <typename T> static void f() {} }; }; template <typename T> void f() { T::C::template f<int>(); } 并使用A::C

.template f<int>()