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

标签: c++templatesenums

解决方案


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

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

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


推荐阅读