在我发现的书中,有一段代码计算给定数字的平方根,但该代码无法编译。实例化模板时有很多错误。这是代码:
#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”,第一个代码就会编译。这里的真正问题是什么?
最佳答案
您可以使用 static constexpr int
而不是 enum
。
template <int N, int LO=1, int HI=N> struct Sqrt {
static constexpr int mid = (LO+HI+1)/2;
static constexpr int result = (N<mid*mid) ? Sqrt<N,LO,mid-1>::result : Sqrt<N,mid,HI>::result;
};
template<int N, int M> struct Sqrt<N,M,M> {
static constexpr int result=M;
};
关于c++ - 如何摆脱 C++ 中的枚举不匹配错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51775512/