Который перестал компилироваться, когда я в настройках проекта (VS2019) указал С++17.
Error C2912 explicit specialization 'void std::swap<ole_lib::TConnectData2>(ole_lib::TConnectData2 &,ole_lib::TConnectData2 &)' is not a specialization of a function template
это не специализация, а перегрузка функции, которая будет вызываться для классов, производных от ole_lib::TConnectData2 — а мне такое не надо... я правильно понимаю?
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
КД>--- КД>Но, все таки, пусть кто-нибудь все таки объяснит — что это за "template<class T,class>"?
КД>Это хрень для выявления корявого кода подобного моему?
msvc имплементация для явной специализации
в других gcc,clang и стандарте такого нет
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Здравствуйте, reversecode, Вы писали:
R>>http://www.gotw.ca/publications/mill17.htm R>>не понятно зачем вы ее вообще специализируете
КД>Дык, научили же так. Лет 15 назад в сети увидел и начал делать так же
R>>перегрузите и хватит
КД>Да. Так и поступил.
КД>Тут, на самом деле, всего три проблемных случая (Слава Всевышнему!) — и это просто чудо для моего объема кода.
КД>Все три связанных класса объявил как final — чтобы не было проблем.
КД>Проект собрался, но работает он или нет пока не знаю.
R>>но за пихание в стд конечно бить по рукам надо
КД>Ну, спасибо что хоть не по голове ногами
КД>--- КД>Но, все таки, пусть кто-нибудь все таки объяснит — что это за "template<class T,class>"?
КД>Это хрень для выявления корявого кода подобного моему?
Это специализация (с стиле enable_if), различных стратегий swap, в зависимости от того есть ли конструктор перемещения или только копирования.
И это отступление от стандарта.
Можно было и без введения дополнительного класса в сигнатуру...
Можно было сделать дополнительную ф-ю _Move с дополнительным аргументом шаблона, естак им проще...
16.5.4.2.1 Namespace std [namespace.std]
1 Unless otherwise specified, the behavior of a C++ program is undefined if it adds declarations or definitions
to namespace std or to a namespace within namespace std.
хотя может для swap и есть исключение, но я так не думаю.
КД>А как теперь правильно определять специализацию для std::swap? КД>Может я и раньше неправильно её определял?
Я глубоко не разбирался в этом вопросе, только вот знаю, что в стандарт ввели customization point objects. Описание тут
Я сам не использовал customization point objects, поэтому могу только посоветовать поискать в этом направлении.
Здравствуйте, B0FEE664, Вы писали:
BFE>Я глубоко не разбирался в этом вопросе, только вот знаю, что в стандарт ввели customization point objects. BFE>Описание тут
The correct usage of customization points like swap is to first bring the standard swap into scope with a using declaration, and then to call swap unqualified:
using std::swap;
swap(a, b);
One problem with this approach is that it is error-prone. It is all too easy to call (qualified) std::swap in a generic context, which is potentially wrong since it will fail to find any user-defined overloads.
Блин, я только-только изничтожил глобальный "using namespace std" (и не только) и начал явно указывать std::, как опять это объявляется неправильным
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
BFE>16.5.4.2.1 Namespace std [namespace.std]
BFE>1 Unless otherwise specified, the behavior of a C++ program is undefined if it adds declarations or definitions
BFE>to namespace std or to a namespace within namespace std.
Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.173
R>Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.173
Я так понял, что any standard library class template — это только для шаблона класса, а не шаблона функции. Я понял не правильно?
R>>Unless explicitly prohibited, a program may add a template specialization for any standard library class template to namespace std provided that (a) the added declaration depends on at least one program-defined type and (b) the specialization meets the standard library requirements for the original template.173
BFE>Я так понял, что any standard library class template — это только для шаблона класса, а не шаблона функции. Я понял не правильно?
Гм... Действительно. Здесь произошло изменение формулировки. В более ранних версиях (4659/4640/2017-03-21), формулировка несколько другая:
The behavior of a C++ program is undefined if it adds declarations or definitions to namespace std or to a namespace within namespace std unless otherwise specified. A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.176
Нужно будет поисследовать этот вопрос более детально. Я думаю, что здесь имеет место изменение формулировок, без изменения выводов по обсуждаемым ключевым вопросам.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, B0FEE664, Вы писали:
BFE>Так это через customization point. Я так понимаю, что в C++17 их нет, а в C++20 я ещё не понял, как правильно их использовать. Расскажите?
Я пока тоже не владею, к сожалению. Тут конфуз вышел с моей привычкой запускать поиск по более pdf файлу, а ссылки давать на более новый онлайн документ. Нарвался впопыхах на сущесвенные изменения.
--
Не можешь достичь желаемого — пожелай достигнутого.
Я тут погуглил немного и, если я все правильно понял, то прикладному разработчику не требуется делать никаких телодвижений, связанных с customization point objects. Эти объекты — внутренняя фишка стандартной библиотеки, обеспечивающая проверку концептов. Все, что требуется разработчику, это просто написать обычную перегрузку для фунции, обозначенной как customization point. Наиболее часто упоминаются такие функции как std::swap, std::begin, std::end.
--
Не можешь достичь желаемого — пожелай достигнутого.
Здравствуйте, Коваленко Дмитрий, Вы писали:
КД>Блин, я только-только изничтожил глобальный "using namespace std" (и не только) и начал явно указывать std::, как опять это объявляется неправильным
The template function boost::swap allows the values of two variables to be swapped, using argument dependent lookup to select a specialized swap function if available. If no specialized swap function is available, std::swap is used.
Здравствуйте, Коваленко Дмитрий, Вы писали: КД>Я так понимаю что
<…> КД>это не специализация, а перегрузка функции,
Да, правильно
КД>которая будет вызываться для классов, производных от ole_lib::TConnectData2 — а мне такое не надо... я правильно понимаю?
А это неправильно.
Шаблон подставится в swap( Производный класс )
А явная перегрузка даст swap( ole_lib::TConnectData2 )
Как думаешь, что выберется?.. shuffle:
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
ομι>The template function boost::swap allows the values of two variables to be swapped, using argument dependent lookup to select a specialized swap function if available. If no specialized swap function is available, std::swap is used.