我正在尝试了解使用template
和typename
的位置,我遇到了一个我无法解决的问题。我有一个模板函数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
的公共模板函数。我在这里做错了什么?
答案 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>()