对多种数据类型进行布尔测试的 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::Plus
或 Z2::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){
~^~
我无法理解此错误消息。所以我的问题是:
- 1) 错误信息是什么意思?
- 2) 我应该怎么做才能让模板接受多种数据类型的条件?
非常感谢您的帮助。
使用 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==
,也没有从 Z2 到 int[= 的隐式转换44=]
如果你想混合使用 Z2 和 int 使用非 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 $
我已经尝试了很长一段时间来创建一个接受不同类型数据的模板。 A 有一个 class Z2 定义一个整数的符号,它是一个枚举 class 以这种方式指定:
enum class Z2 {Plus, Minus};
我必须创建一个名为 mypow
的模板,对于其中输入的任何类型的数据(float、int、Z2 类型等),它的类型为 Z2,它将 return 符号输入数据的格式 Z2::Plus
或 Z2::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){
~^~
我无法理解此错误消息。所以我的问题是:
- 1) 错误信息是什么意思?
- 2) 我应该怎么做才能让模板接受多种数据类型的条件?
非常感谢您的帮助。
使用 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==
,也没有从 Z2 到 int[= 的隐式转换44=]
如果你想混合使用 Z2 和 int 使用非 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 $