6

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

source.cpp: In function 'void f()':
source.cpp:11:19: error: non-template 'f'used as template
source.cpp:11:19: note: use'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'

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

4

1 回答 1

7

假设我们f static这样可以在没有实例的情况下调用它,那么您不需要,typename因为您没有使用依赖类型创建任何歧义(即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>()

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>();
}
于 2012-10-18T16:27:35.727 回答