Шаблон C ++ с логическими тестами для нескольких типов данных получает ошибку соответствия - PullRequest
0 голосов
/ 27 апреля 2019

Я довольно давно пытаюсь создать шаблон, который принимает разные типы данных.У класса Z2 определяется знак целого числа, являющегося классом перечисления, указанным таким образом:

enum class Z2 {Plus, Minus};

Мне нужно создать шаблон с именем mypow, который имеет тип Z2 для любого типа введенных данных.в нем (типы float, int, Z2 и т. д.), которые будут возвращать знак введенных данных в формате 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) Как мне сделать, чтобы шаблон принимал условия для нескольких типов данных?

Большое спасибо за вашу помощь.

1 Ответ

1 голос
/ 27 апреля 2019

При использовании enum class Z2 {Plus, Minus}; (вместо enum Z2 {Plus, Minus};) не существует неявного преобразования из Z2 и int (это одна из их целей)

Так что если вы сделаете

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

у вас проблема в a>0, потому что нет operator> для Z2 и неявного преобразования из Z2 в int

и когда вы делаете, например,

mypow<int>(1, 2);

, у вас есть проблема в a==Z2::Minus, потому что нет ни operator== на Z2, ни неявного преобразования из Z2 в int


Если вы хотите смешать Z2 и int , используйте некласс 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 $ 
...