Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
6 / 6 / 2
Регистрация: 29.03.2012
Сообщений: 101
1

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

08.03.2019, 15:14. Показов 1749. Ответов 17

Author24 — интернет-сервис помощи студентам
Почему присутствие структуры Hard Logic приводит к ошибке компиляции, а структуры SoftLogic — нет?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Noncomparable{};
 
struct HardLogic {
   Noncomparable nc1, nc2;
   void compare() {
       nc1 == nc2; //Ошибка компилятора: бинарный "==": не найден оператор, принимающий левый операнд типа "Noncomparable" (или приемлемое преобразование отсутствует)
   }
};
 
template<class T> 
struct SoftLogic {
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2; //Нет ошибки
   }
};
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.03.2019, 15:14
Ответы с готовыми решениями:

Перегрузка оператора [] и шаблоны.
Всем доброго времени суток! Проблема такая: есть класс сVector template &lt;class T, int Size&gt;...

Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне
Доброго времени суток, уважаемые форумчане! Есть класс-шаблон, реализующий объект &quot;Матрица&quot;. Для...

Перегрузка и шаблоны
Для каждого пункта задания создать: 1. Перегружаемые функции для типов int и double 2. Шаблоны...

Перегрузка операторов и шаблоны
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas;...

17
 Аватар для eva2326
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
08.03.2019, 15:29 2
Цитата Сообщение от HelloWorld56 Посмотреть сообщение
Почему присутствие структуры Hard Logic приводит к ошибке компиляции, а структуры SoftLogic — нет?
Потому что у вас компилятор от вижуал студии)))

Ошибка себя проявит сразу же, как только вы попытаетесь инстанцировать шаблон:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
 
class Noncomparable{};
 
template<class T> 
struct SoftLogic {
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2; //Нет ошибки
   }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    
    SoftLogic<ini> logic;
}
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
08.03.2019, 15:29 3
Лучший ответ Сообщение было отмечено HelloWorld56 как решение

Решение

HelloWorld56, потому что SoftLogic - это не структура, а шаблон структуры. Ошибка будет только если к коде появится инстанцирование функции SoftLogic<T>::compare, т.е. появится потребность в конкретной реализации, как в случае с HardLogic::compare.
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 15:41 4
HelloWorld56, SFINAE это то, что работает только если находится наиболее близкое соответствие. Если оно вообще не ищется - компилятор полностью игнорит шаблон. А не шаблонный метод генерируется, даже если нет вызова. Хотя это может быть вопросом реализаций, ключей, оптимизаций и пр. ктулхуазмов.

eva2326, с праздником!
0
 Аватар для eva2326
1659 / 488 / 106
Регистрация: 17.05.2015
Сообщений: 1,497
08.03.2019, 15:52 5
Цитата Сообщение от IGPIGP Посмотреть сообщение
с праздником!
мерси!

Цитата Сообщение от IGPIGP Посмотреть сообщение
SFINAE это то, что работает только если находится наиболее близкое соответствие. Если оно вообще не ищется - компилятор полностью игнорит шаблон. А не шаблонный метод генерируется, даже если нет вызова. Хотя это может быть вопросом реализаций, ключей, оптимизаций и пр. ктулхуазмов.
А теперь правильный ответ)))

CL - компилятор от вижуал студии, использует одно фазный парсинг шаблонов.
Пока шаблон не инстанцирован, он даже не пытается валидировать синтаксис реализации шаблонов.
Поэтому, в самой реализации можно написать любую некомпилируемую муть, и это будет работать:

https://rextester.com/HII36365


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
 
 
template<class T> struct SoftLogic 
{
 
   void compare() 
   {
       // любая откровенно не компилируемая фигня
       osdfgjdslk dsjfsdjfljs 1231 fdgfd
 
   }
};
 
int main()
{
}

Стандарт же рекомендует использовать двух фазный парсинг.
В этом случае, компилятор уже на первой фазе (когда ещё не известны формальные параметры шаблона)
уже попытается провести максимально возможную диагностику синтаксиса.
И, разумеется, выявит совсем уж очевидные ошибки)


например, gcc сразу пофиксил ошибку

error: no match for ‘operator==’ (operand types are ‘Noncomparable’ and ‘Noncomparable’)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class Noncomparable{};
 
 
template<class T> 
struct SoftLogic {
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2;
   }
};
 
int main()
{
}
1
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 16:03 6
Цитата Сообщение от IGPIGP Посмотреть сообщение
SFINAE это то, что работает только если находится наиболее близкое соответствие.
Каким место здесь SFINAE затесалось?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 16:32 7
Цитата Сообщение от eva2326 Посмотреть сообщение
Пока шаблон не инстанцирован, он даже не пытается валидировать синтаксис реализации шаблонов.
eva2326, с синтаксисом там нет проблем. Там нет перегруженного оператора для данного типа. Но поскольку нет инстанциирующего вызова, данный шаблон вообще не компилируется. Не потому что нельзя скомпилировать, а потому что нет инстанцирования и никто, соответственно, не делает подстановки (чтобы получить ошибку вызова операции).
Цитата Сообщение от eva2326 Посмотреть сообщение
Стандарт же рекомендует
О том, что это вопрос реализации (кривой вероятно, не спорю) я написал. Однако в защиту майкрософт (что редко у меня случается) скажу. Нет вреда в таком поведении (рекомендации и требования это !=). Только быстрее компилится. И да, - холливар не предлагать!
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 16:49 8
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако в защиту майкрософт
Майкрософт уже справляется с этой проблемой.
Цитата Сообщение от eva2326 Посмотреть сообщение
Потому что у вас компилятор от вижуал студии
А если указать ключ /permissive-switch для VS 2017 15.3?
Там, вроде, поправили. Или частично поправили.

Добавлено через 1 минуту
Во, вот тут говорят, что скоро оно будет по дефолту.
https://devblogs.microsoft.com... s-to-msvc/
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 18:27 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Майкрософт уже справляется с этой проблемой.
Это не проблема. Если бы компилировалось:
C++
1
2
3
4
5
6
7
template<> 
struct SoftLogic <Noncomparable>{
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2; //уже есть
   }
};
была бы проблема, но тут у ms всё ок.
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 18:38 10
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это не проблема.
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
void foo()
{
    using lkdfsgdlfkn98954**-d+gdgsdgd
}
 
 
int main()
{
}
То есть не проблема, что оно собирается без проблем? Ну лан.

https://rextester.com/ULYXQ75622
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 18:56 11
Цитата Сообщение от Croessmah Посмотреть сообщение
То есть не проблема, что оно собирается без проблем? Ну лан.
Слава богу что вы согласились. Моя 2008-я генерит один и тот же экзешник независимо от того присутствуют эти классы или нет:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<class T> 
struct SoftLogic {
   Noncomparable nc1,nc2;
   void compare() {
      nc1 == nc2;
   }
};
 
template<typename T>
void foo()
{
    using lkdfsgdlfkn98954**-d+gdgsdgd
}
то есть они просто не компилируются, как и говорилось.
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 19:33 12
Цитата Сообщение от IGPIGP Посмотреть сообщение
Моя 2008-я генерит один и тот же экзешник независимо от того присутствуют эти классы или нет:
Другие компиляторы также делают, но всё-таки производят вторую фазу, как и должно.
Собственно, если Вы не заметили, мелкософт с этим тоже согласен, и работает над этим.
Так что, кроме Вас, наверное, это больше никому не надо.
Ошибки синтаксиса и то что заведомо не компилируемо лучше сразу отсечь, а не при инстанцировании.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Слава богу что вы согласились.
Я не соглашался, я лишь забил.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 20:11 13
Цитата Сообщение от Croessmah Посмотреть сообщение
Так что, кроме Вас, наверное, это больше никому не надо.
Цитата Сообщение от IGPIGP Посмотреть сообщение
О том, что это вопрос реализации (кривой вероятно, не спорю) я написал.
Но да. Это написал я и ни кто другой.
Цитата Сообщение от Croessmah Посмотреть сообщение
Ошибки синтаксиса и то что заведомо не компилируемо лучше сразу отсечь, а не при инстанцировании.
Кто спорит? Вред - налицо. Нельзя компилить быстро. Надо проверить всё что может быть ненужно, потому что когда оно станет нужно его никто уже провыерять не будет. Забьёт и всё. Лан, это значит - забить?
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 20:43 14
IGPIGP, "лан" - это как "Ой, всё!".
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 20:53 15
Да лан? Ну лан.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,884
Записей в блоге: 1
08.03.2019, 20:54 16
Цитата Сообщение от eva2326 Посмотреть сообщение
Поэтому, в самой реализации можно написать любую некомпилируемую муть, и это будет работать:
зашили?
Миниатюры
Перегрузка оператора == и шаблоны  
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
08.03.2019, 21:08 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вред - налицо. Нельзя компилить быстро. Надо проверить всё что может быть ненужно
Это однобокий взгляд. Вот Вам пример для взгляда с другой стороны.
Заголовочный файл с шаблоном включается в тысячу единиц трансляции.
Все единицы трансляции используют что-то из этого заголовка.
Та единица трансляции, которая инстанцирует код с глупой ошибкой компилируется последней.
Итого, компилируется 999 файлов, после чего, при инстанцировании выявляется ошибка.
Вы её исправляете, и теперь нужно перекомпилировать опять всю тысячу зависимых единиц трансляции.
А ведь ошибка могла быть обнаружена еще при компиляции первого файла, включающего "плохой" заголовок.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4704 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.03.2019, 21:15 18
Croessmah, ужосы рассказываете. Можно и не такое придумать. Однако, я ни где не написал, что это хорошо. Более того, я написал, что это вероятно кривовато, но большого вреда в этом нет.
В больших проектах всё что порождает глобальные зависимости - это уже архитектурные костыли в том случае, если оно требует частого изменения. И такие вещи (изменения требующие глобальной или по крайней мере, значительной перекомпиляции) всегда являются предметом пристального анализа и огромной ответственности. Там никому памперсы и предупреждающие знаки не нужны. Ну почти ни кому.
Но если есть возможность не делать лишнюю работу, то это можно использовать не только на пользу. Вообще, использовать возможности во вред всегда легче. Тут нет ни чего удивительного.
1
08.03.2019, 21:15
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.03.2019, 21:15
Помогаю со студенческими работами здесь

Перегрузка и шаблоны функций
Добрый день. Приведенную нижу задачу нужно оформить в виде шаблонов функций. В одномерном массиве,...

Шаблоны перегрузка ввода/вывода
#include &lt;iostream&gt; #include &lt;assert.h&gt; #include &lt;stdlib.h&gt; using namespace std; template...

Перегрузка операторов через шаблоны
Есть класс дробь, переопределил операторы (внутри класса). В таком случае (дробь оператор что-то)...

Шаблоны и перегрузка различных операторов
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Элементы алгоритмизации
hw_wired 28.01.2025
Основы алгоритмизации В современном мире алгоритмы играют фундаментальную роль в развитии информационных технологий и программирования. Понимание основ алгоритмизации является ключевым элементом в. . .
Человек и информация
hw_wired 28.01.2025
Введение: роль информации в познании мира В современном мире информация играет фундаментальную роль в процессе познания окружающей действительности. Она представляет собой совокупность сведений об. . .
Компьютер и информация
hw_wired 28.01.2025
Эволюция вычислительных машин История развития вычислительной техники начинается задолго до появления первых электронных устройств. Человечество всегда стремилось упростить процесс вычислений и. . .
Информационные технологии
hw_wired 28.01.2025
Введение в современные технологии работы с информацией В современном мире информационные технологии стали неотъемлемой частью практически всех сфер человеческой деятельности. Они существенно. . .
Информация вокруг нас
hw_wired 28.01.2025
Основные понятия информации В современном мире понятие информации является фундаментальным и охватывает практически все сферы человеческой деятельности. Информация представляет собой совокупность. . .
Компьютер для начинающих
hw_wired 28.01.2025
Введение в мир компьютерных технологий В современном мире информация стала одним из важнейших ресурсов человечества, определяющим развитие общества и технологий. Наша жизнь неразрывно связана с. . .
[golang] 189. Rotate Array
alhaos 28.01.2025
Повороты рукоятки, целочисленный слайс нужно сдвинуть на целое положительное число. Мне очень нравится решение на GO / / https:/ / leetcode. com/ studyplan/ top-interview-150/ package topInterview . . .
КуМир: решение задач на матрицы
bytestream 28.01.2025
КуМир представляет собой среду для обучения программированию, которая включает в себя мощные инструменты для работы с матрицами. Матрица в программировании - это двумерный массив, состоящий из. . .
КуМир: решение задач на строки
bytestream 28.01.2025
В системе программирования КуМир работа со строковыми данными является одним из важнейших аспектов создания программ. Строки представляют собой последовательности символов, заключенные в кавычки,. . .
КуМир: решение геометрических задач
bytestream 28.01.2025
Программирование геометрических задач в среде КуМир становится всё более актуальным в обучении школьников и студентов. КуМир — это разработанная в России обучающая программная среда, предназначенная. . .
КуМир, исполнитель Водолей: Задачи и решения
bytestream 28.01.2025
КуМир — это образовательная среда для обучения программированию. Она предлагает пользователям разнообразные инструменты для разработки и отладки программ, что особенно ценно для студентов и. . .
КуМир, исполнитель Чертежник: Решение задач
bytestream 28.01.2025
КуМир (Комплект Учебных МИРов) представляет собой образовательную среду для обучения основам программирования и алгоритмизации. Исполнитель Чертежник работает на координатной плоскости, где может. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru