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

标签 c++ templates enums

在我发现的书中,有一段代码计算给定数字的平方根,但该代码无法编译。实例化模板时有很多错误。这是代码:

#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/

相关文章:

c++ - auto_ptr<T> 的模板特化

java - 为什么枚举在这种情况下比 HashMap 更有用?

c# - 如何在C#中设置ushort的最左和最右位

c++ - 模板成员函数无法自动推断类型

c++ - OpenGL 如何知道它应该根据 GL_ARRAY_BUFFER 将顶点绘制到什么位置?

c++ - 不清楚的 typedef 类型

c++ - 为 EventDriver 传递和存储模板函数指针

java - Ruby 中的高级类 Java 枚举

c++ - 派生模板类不调用构造函数

c++ - 对象作为数组索引