繁体   English   中英

如何摆脱C ++中的枚举不匹配错误?

[英]How to get rid of an enumeral mismatch error in 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”放入编译器选项中,则会编译第一个代码。 这里真正的问题是什么?

可以使用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;
};

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM