Перегрузка оператора == и шаблоны

110
16 ноября 2019, 20:40

Почему присутствие структуры Hard Logic приводит к ошибке компиляции, а структуры SoftLogic — нет?

class Noncomparable{};
struct HardLogic {
   Noncomparable nc1, nc2;
   void compare() {
       nc1 == nc2; //Ошибка компилятора: бинарный "==": не найден оператор, принимающий левый операнд типа "Noncomparable" (или приемлемое преобразование отсутствует)
   }
};
template<class T> 
struct SoftLogic {
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2; //Нет ошибки
   }
};
Answer 1

В данном случае невозможность создать для шаблона SoftLogic::compare валидную специализацию делает все программу невалидной, причем диагностика в этом случае не требуется:

17.7 Name resolution [temp.res]
8 The program is ill-formed, no diagnostic required, if:
(8.1) — no valid specialization can be generated for a template or a substatement of a constexpr if statement (9.4.1) within a template and the template is not instantiated, or

Answer 2

потому что SoftLogic - это не структура, а шаблон структуры. Ошибка будет только если к коде появится инстанцирование функции SoftLogic::compare, т.е. появится потребность в конкретной реализации, как в случае с HardLogic::compare.

READ ALSO
Перевести строку в число не использую стандартные функции [закрыт]

Перевести строку в число не использую стандартные функции [закрыт]

Мне нужно написать программу которая переводит строку в числоНапример: вводится строка "1234" на выход получаем число 1234, все было бы проще...

125
Область применения std::weak_ptr

Область применения std::weak_ptr

std::weak_ptr может быть создан из std::shared_ptr, но у меня такой вопросweak_ptr может вернуть информацию про умный указатель, точнее висячий он или нет

124
Форматированный вывод в консоль C++

Форматированный вывод в консоль C++

Имеется массив структур device следующего вида:

158