tem*_*boy 5 c++ templates struct
我试图了解在哪里使用template,typename但遇到了一个我无法解决的问题。我有一个模板函数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'
我相信,这个错误是不正确的,有是在事实上称为公共模板函数f中struct A::C。我在这里做错了什么?
假设我们 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)