c++ - 在模板类中调用静态模板方法的问题
问题描述
我里面有一个模板类和一个静态模板方法。我还有一个简单的函数 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>();
}
解决方案
您需要添加一个template
关键字:
template<types type, typename T>
T g() {
return A<type>::template f<T>();
}
A<type>::f
是一个依赖名称(取决于模板参数type
)。为了在遇到模板定义时正确解析该语句(根据两阶段查找规则的要求),编译器必须在实例化之前知道f
是变量、类型还是模板。它默认为“它是一个变量”;addtemplate
表示模板或typename
表示类型。
您的其他情况有效,因为return A<types::a>::f<T>();
没有从属名称。
推荐阅读
- mysql - 为 MySQL 子查询或跨范围连接使用索引
- bash - 更改内存中脚本的名称或其他解决方法
- cmake - 为多个目标重用变量中的 target_compile_options (CMake)
- java - 有没有办法使用 Spring 数据创建 teradata volatile 表并在会话后将其删除
- docker - 在 docker 容器中安装 cuda 时出现异常错误
- powershell - 如何将 chrome 书签从单个桌面上的不同用户配置文件复制到另一个网络位置
- ssh - ksh 远程函数 ssh 调用另一个远程函数
- java - Heroku - 使用 Deploy to Heroku 按钮时忽略 mvnw
- macos - TP-LINK WN722N 无线 USB 设备被 macOS 识别为以太网设备
- c# - WPF 不会始终刷新组合框项目列表