我内部有一个模板类和一个静态模板方法。我还有一个简单的函数g,它仅允许用户以适当的方式调用此方法。这段代码给我g函数中的错误“在'>'标记之前预期的主表达式”。但是,如果我在g函数内部调用这样的方法:
return A<types::a>::f<T>();
在这种情况下,代码可以正常编译,并且不会出错。我怎么可能解决此问题,这是什么问题?
enum class types : uint8_t
{
a, b
};
template<types type>
struct A {
template<typename T>
static T f();
};
template<>
template<typename T>
T A<types::a>::f() {
cout << "a" << endl;
return T{};
}
template<>
template<typename T>
T A<types::b>::f() {
cout << "b" << endl;
return T{};
}
template<types type, typename T>
T g() {
return A<type>::f<T>();
}
int main() {
g<types::a, int>();
}
答案 0 :(得分:1)
您需要添加一个template
关键字:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
A<type>::f
是一个从属名称(取决于模板参数type
)。为了在遇到模板定义时正确解析此语句(两阶段查找规则要求),编译器必须在实例化之前知道 f
是变量,类型还是变量。模板。默认为“这是一个变量”;添加template
表示模板或添加typename
表示类型。
您的其他情况也可行,因为在return A<types::a>::f<T>();
中没有从属名称。