如何摆脱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"放在编译器选项中,第一个代码就会编译。这里真正的问题是什么?

代替enum,你可以使用static constexpr int

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;
};

要摆脱警告,您可以将枚举转换为它们的整数值。 这意味着您有两个整数,而不是两个不同的枚举。

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;
}

将在没有警告的情况下编译。 至于为什么即使编译也会收到这些警告,请参阅:为什么直接比较两个枚举时会出现错误?

最新更新