Ошибка : %: недопустимо, левый операнд имеет тип "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 шт):
Самый простой способ решить Вашу проблему - сделать специализацию для 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;
}
и все.