为什么我收到错误“非模板‘f’用作模板”

tem*_*boy 5 c++ templates struct

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

source.cpp:在函数中'void f()'
source.cpp:11:19: error: non-template 'f'used as template
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>();

}
Run Code Online (Sandbox Code Playgroud)

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

// ...
typename T::C::template f<int>();
// ...
Run Code Online (Sandbox Code Playgroud)

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

错误:没有名为类模板'f''struct A::C'

我相信,这个错误是不正确的,有在事实上称为公共模板函数fstruct A::C。我在这里做错了什么?

Set*_*gie 7

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

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

template <typename T> void f() {
  T::C::template f<int>();
}
Run Code Online (Sandbox Code Playgroud)

如果你不想让它成为静态的,你可以创建一个A::C并使用.template f<int>()

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

template <typename T> void f() {
  typename T::C c;
//^^^^^^^^ Now we DO need typename to disambiguate.

  c.template f<int>();
}
Run Code Online (Sandbox Code Playgroud)