c++ - 如何摆脱 C++ 中的枚举不匹配错误?
问题描述
在我发现的书中,有一个代码计算给定数字的平方根,但该代码无法编译。实例化模板时有很多错误。这是代码:
#include <iostream>
template
<int N, int LO=1, int HI=N> class Sqrt {
public:
enum { mid = (LO+HI+1)/2 };
enum { result = (N<mid*mid) ? Sqrt<N,LO,mid-1>::result : Sqrt<N,mid,HI>::result };
};
template<int N, int M> class Sqrt<N,M,M> {
public:
enum { result=M };
};
int main()
{
std::cout << Sqrt<5>::result << std::endl;
}
许多警告是
enumeral mismatch in conditional expression 'Sqrt<5,1,1>::< anonymous enum> vs 'Sqrt<5,2,2>::< anonymous enum>' [-Wenum-compare]
正如我稍后测试的那样,这个警告并不重要,例如在代码中
class a {
public:
enum {test = 0};
};
class b {
public:
enum {test = 1};
};
class c {
public:
enum {test = 2 < 3 ? a::test : b::test};
};
int main()
{
int v = c::test;
}
我得到同样的警告,但代码编译。我的困惑是因为如果我将“-Wenum-compare”放在编译器选项中,第一个代码就会编译。这里真正的问题是什么?
解决方案
要摆脱警告,您可以将枚举转换为其整数值。这意味着您有两个整数而不是两个不同的枚举。
template
<int N, int LO=1, int HI=N> class Sqrt {
public:
enum { mid = (LO+HI+1)/2 };
enum { result = (N<mid*mid) ? static_cast<int>(Sqrt<N,LO,mid-1>::result) : static_cast<int>(Sqrt<N,mid,HI>::result) };
};
template<int N, int M> class Sqrt<N,M,M> {
public:
enum { result=M };
};
int main()
{
std::cout << Sqrt<5>::result << std::endl;
}
将在没有警告的情况下编译。至于为什么即使编译也会收到这些警告,请参阅:直接比较两个枚举时为什么会出错?
推荐阅读
- webpack - 安装 npm webpack-cli 导致无法理解的警告
- c - 使用 HCS12 微控制器防止读取损坏
- php - 使用 JQuery 向表中添加值。使用 PHP 循环创建的表
- csom - 从项目中获取版本
- c - 打印多个字符,格式化为整数
- xgboost - xgboost rank pairwise 什么是预测输入和输出
- ruby-on-rails - 路由在测试中不匹配,但在应用程序中被识别
- c# - CanExecute RelayCommand MVVMLight 5+ 上的奇怪行为
- python-3.x - 在python 3中使用全局变量进行酸洗时调用全局变量会导致错误
- html - CSS网格-溢出时如何让所有列/行均匀增长