C++ 为什么我会犯错误;非模板&x27;f';用作模板“;

C++ 为什么我会犯错误;非模板&x27;f';用作模板“;,c++,templates,struct,C++,Templates,Struct,我试图理解在哪里使用模板和类型名,我遇到了一个无法解决的问题。我有一个模板函数f,它使用传递给它的类型(将是一个类)调用模板成员函数.f。我认为我在函数体中使用的typename是正确的,但是,我不断得到以下错误: source.cpp:在函数“void f()”中: source.cpp:11:19:错误:非模板'f'用作模板 source.cpp:11:19:注意:使用'typename T::C::template f'指示它是一个模板 我照上面说的做了,但随后我收到了下一行错误: 错误:

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

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

我照上面说的做了,但随后我收到了下一行错误:

错误:在
'struct A::C'


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

假设我们将
f
设置为静态的,这样就可以无需实例调用它,那么就不需要
typename
,因为你没有用依赖类型创建任何歧义(即
C
不能是变量,因为你在
之后使用它:
)。以下是正确的语法:

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

template <typename T> void f() {
  T::C::template f<int>();
}

如果我们去掉了
static
,那么调用
f
,我们需要做什么呢?你的意思是
T::C->template f()
?回答得很好,但我还有另一个问题:
static
修饰符如何允许调用
f
,而无需提供实例?@user6607这就是
static
在本文中的含义。它使类定义中的函数不是成员函数,因此它不与特定实例关联,并且可以在不必首先创建对象的情况下调用它<代码>静态< /COD>类函数没有<代码>这个// ... typename T::C::template f<int>(); // ...
struct A {
  struct C {
     template <typename T>
     static void f() {}
  };
};

template <typename T> void f() {
  T::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>();
}