对多种数据类型进行布尔测试的 C++ 模板会出现匹配错误

C++ Template with boolean tests for multiple types of data gets error of match

我已经尝试了很长一段时间来创建一个接受不同类型数据的模板。 A 有一个 class Z2 定义一个整数的符号,它是一个枚举 class 以这种方式指定:

enum class Z2 {Plus, Minus};

我必须创建一个名为 mypow 的模板,对于其中输入的任何类型的数据(float、int、Z2 类型等),它的类型为 Z2,它将 return 符号输入数据的格式 Z2::PlusZ2::Minus

我最后的尝试是这样的:

template <class T> Z2 mypow(T a,unsigned int N){
  if (a==Z2::Plus || a>0){
    return Z2::Plus;
  }else if((a==Z2::Minus||a<0) && N%2==0){
    return Z2::Plus;
  }else{
    return Z2::Minus;
  }
}

然而,每次我 运行 我得到的代码

error: no match for ‘operator>’ (operand types are ‘Z2’ and ‘int’)
if (a==Z2::Plus || a>0){
~^~

我无法理解此错误消息。所以我的问题是:

非常感谢您的帮助。

使用 enum class Z2 {Plus, Minus};(而不是 enum Z2 {Plus, Minus};)没有从 Z2 和 int 的隐式转换(这是他们的目标之一)

所以如果你这样做

mypow<Z2>(Z2::Plus, 2);

你在 a>0 中遇到了问题,因为 Z2 没有 operator>,也没有从 Z2[=44= 隐式转换] 到 int

当你这样做时

mypow<int>(1, 2);

你在 a==Z2::Minus 中遇到问题,因为 Z2 上没有 operator==,也没有从 Z2int[= 的隐式转换44=]


如果你想混合使用 Z2int 使用非 class enum

enum Z2 {Plus, Minus};

template <class T> Z2 mypow(T a,unsigned int N){
  if (a==Z2::Plus || a>0){
    return Z2::Plus;
  }else if((a==Z2::Minus||a<0) && N%2==0){
    return Z2::Plus;
  }else{
    return Z2::Minus;
  }
}

int main()
{
  Z2 a = mypow<Z2>(Plus, 2);
  Z2 b = mypow<int>(1, 2);

  return a == b;
}

编译:

pi@raspberrypi:/tmp $ g++ -pedantic -Wextra -Wall e.cc
pi@raspberrypi:/tmp $