Ошибка : %: недопустимо, левый операнд имеет тип "T". C++

template <typename T> void mltOnTwo(Matrix<T>& a)
{
    if (typeid(T) == typeid(int))
    {
        for (int i = 0; i < a.GetRows(); i++)
        {
            for (int j = 0; j < a.GetCols(); j++)
            {
                if (a(i, j) % 2 == 0)
                {
                    a(i, j) *= 2;
                }
            }
        }
    }
    else
    {
        
        cout << "Error, impossible to do individual task with this data type" << endl;
    }
}

int main()
{
    Matrix<Fraction> a(2, 2);
    cout << "Enter 4 array elements of fractions:" << endl << "(sign, unit, num, denom)";
    cin >> a;
    cout << "------------------------------------" << endl;
    cout << a << endl;
    cout << "Minimal element:" << min(a) << endl;
    cout << "Individual task:" << endl << "------------------------------------" << endl;
    mltOnTwo(a);
    cout << a;
    Matrix<int> b(2, 2);
    cout << "Enter 4 array elements of integer:" << endl;
    cin >> b;
    cout << "------------------------------------" << endl;
    cout << b << endl;
    cout << "Minimal element:" << min(b) << endl;
    cout << "Individual task:" << endl << "------------------------------------" << endl;
    mltOnTwo(b);
    cout << b;
    Matrix<double> c(2, 2);
    cout << "Enter 4 array elements of integer:" << endl;
    cin >> c;
    cout << "------------------------------------" << endl;
    cout << c << endl;
    cout << "Minimal element:" << min(c) << endl;
    cout << "Individual task:" << endl << "------------------------------------" << endl;
    mltOnTwo(c);
    cout << c;
    return 0;
}

Задание создать 3 массива типов: целые, действительный и массив простых дробей и четные числа умножить на 2. Понял, что % можно использовать только с целыми значениями, поэтому дописал исключение в функцию: если тип данных не int, то выводить ошибку, массивы целых и простых дробей работают отлично, при создании массива действительных прога падает и компилятор выдает ошибку (%: недопустимо, левый операнд имеет тип "T").


Ответы (1 шт):

Автор решения: KoVadim

Самый простой способ решить Вашу проблему - сделать специализацию для int. И теперь для неподдерживаемых типов оно не будет компилироваться.

// основной шаблон, который подходит под любой тип, но
// так как там добавлено delete, то компилятор явно это поймает
// в до 11 стандарта времена можно просто было оставить без тела
// но тогда ругался линковщик. Но можно и тело с ошибкой дописать
template <typename T> void mltOnTwo(Matrix<T>& a) = delete;

// а вот это основная часть для int
template <>
void mltOnTwo(Matrix<int>& a)
{
    for (int i = 0; i < a.GetRows(); i++)
    {
        for (int j = 0; j < a.GetCols(); j++)
        {
            if (a(i, j) % 2 == 0)
            {
                a(i, j) *= 2;
            }
        }
    }
}

Если хочется именно иметь ошибку во время исполнения (ну мало чего), тогда основное определение нужно вот так написать

template <typename T> void mltOnTwo(Matrix<T>& a) {
  std::cout << "Error, impossible to do individual task with this data type" << std::endl;
}

и все.

→ Ссылка