c++ - 错误 C2971 具有非静态存储持续时间的变量不能用作非类型参数
问题描述
这是一个简单的例子(想法是避免函数内部出现巨大的if..else
或switch
块):
namespace foo {
enum class VALUES : int { val_0 = 0, val_1 = 1 };
template<VALUES T>
void print();
template<>
void print<VALUES::val_0>() { std::cout << "val_0\n"; }
template<>
void print<VALUES::val_1>() { std::cout << "val_1\n"; }
void bar(int type) {
VALUES v = static_cast<VALUES>(type);
print<v>(); //error C2971 - "v" is a non-constant argument at compile-time
}
};
问题是如何print<...>()
根据bar
's 参数调用?请不要建议使用if..else
or switch
。
解决方案
模板是在编译时推导出来的。这意味着这些模板参数是常量(在编译时)。在你的情况下,int type
不是一个常量类型,所以是VALUES v
. 为了v
在编译时解析,您需要将其标记为constexpr VALUES v;
,这也意味着您需要使用值对其进行初始化。在这种情况下,使用编译时可解析的值。这就是为什么这有效,
constexpr VALUES v = VALUES::val_0;
print<v>();
但不是这个,
VALUES m = VALUES::val_0;
constexpr VALUES v = m; // As soon as you do this, it is no longer resolvable at compile time.
print<v>();
所以最简单的答案是,您必须使用if
/或模板来完成它。else
switch
推荐阅读
- python - 带有大型数据集的 Python 中的不安绘图
- asp.net-core - Swagger 在本地给出 403 错误
- php - 如何获取/打印实体引用的路径或 URL 到我的树枝模板(Drupal 8)?
- kubernetes - kubernetes envFrom:如何加载位于 pod 文件系统文件中的变量
- sql - 当要更新的每一行都是不同的值时如何更新现有表
- android - 将项目导入Android Studio时如何使自动gradle构建静音?
- android - 为什么 VTS 失败并出现不准确的 adb 错误?
- react-native - 在标签栏中显示组件 react-native-router-flux
- firebase - 有什么方法可以在一个仪表板中查看 iOS 和 Android 的分析数据?
- linux - 如何在 linux 中访问 IIO 设备驱动程序