13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
|
|
1 | |
Объявить метод шаблонного класа как friend в другом классе02.08.2020, 15:08. Показов 1580. Ответов 32
Метки нет (Все метки)
Собственно возможно ли это ?
Насколько я помню что нет так как у метода шаблонного класса не может быть внешнего объявления, а только у специализвции.
0
|
02.08.2020, 15:08 | |
Ответы с готовыми решениями:
32
Как объявить класс с переменной String^ в другом классе? Создать объект шаблонного класса в другом классе Нужно вызвать через сторонний метод(в другом классе,который в другом файле) метод в форме Как объявить массив объектов одного класса в другом классе, а затем поместить в него объекты? |
Комп_Оратор)
|
|||||||||||
03.08.2020, 01:03 | 21 | ||||||||||
oleg-m1973, да, это получается)
и вот такой кошмарик. Это от бессонницы.
0
|
Вездепух
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,068
|
||||||
03.08.2020, 03:30 | 22 | |||||
В Clang попытка указать friend-а через "полное объявление" шаблона
Код
warning: dependent nested name specifier 'A<U>::' for friend class declaration is not supported; turning off access control for 'B' [-Wunsupported-friend] При этом обещанного "turning off access control for 'B'" не происходит, т.е. доступ к B<>::i из A::foo не проходит.
0
|
Комп_Оратор)
|
||||||
03.08.2020, 10:14 | 23 | |||||
Вот шланг:
https://rextester.com/BUU55477 warning: dependent nested name specifier 'Friend_templ<T>::' for friend class declaration is not supported; turning off access control for 'WhoIsMyFriend' [-Wunsupported-friend] void Friend_templ<T>::foo(const WhoIsMyFriend & who, const T& mess); Добавлено через 21 минуту Фактически тупое отключение контроля доступа - приводит к ужасным последствиям. Вот этот код компилируется и работает на шланге:
Microsoft Visual C++ 2019 нормально компилирует и работает на моей машине. Visual C++ 2019 00435-60000-00000-AA687 Microsoft Visual C++ 2019 На сайте Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64 не пропускает: source_file.cpp(29): error C2248: 'WhoIsMyFriend::a': cannot access private member declared in class 'WhoIsMyFriend' source_file.cpp(19): note: see declaration of 'WhoIsMyFriend::a' source_file.cpp(15): note: see declaration of 'WhoIsMyFriend' source_file.cpp(28): note: while compiling class template member function 'void Friend_templ<int>::foo(const WhoIsMyFriend &,const T &)' with [ T=int ] source_file.cpp(37): note: see reference to function template instantiation 'void Friend_templ<int>::foo(const WhoIsMyFriend &,const T &)' being compiled with [ T=int ] source_file.cpp(36): note: see reference to class template instantiation 'Friend_templ<int>' being compiled Microsoft (R) C/C++ Optimizing Compiler Version 19.00.23506 for x64
0
|
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
|
|
03.08.2020, 11:05 | 24 |
Да, я это видел, для кода в #2.
Похоже на то. Если B это класс, а не шаблон класса, то "turning off access control" таки происходит.
0
|
Комп_Оратор)
|
|
03.08.2020, 11:47 | 25 |
oleg-m1973, вы изначально знали или угадали? :
https://rextester.com/OKLY5652 clang компилирует вариант с дружественным классом без проблем. Причём в этом случае достаточно объявления во внешнем скоупе без предварительного объявления) msvs тоже работает тихо: https://rextester.com/VKRONA32253
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
03.08.2020, 11:58 | 26 |
В смысле, угадал? Я постоянно использую friend-классы, в том числе шаблонные. Вот friend-методы никогда не использовал.
1
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
||||||
03.08.2020, 12:06 | 28 | |||||
Ну да, довольно регулярно. А что?
Добавлено через 2 минуты Вот, например, из последнего
1
|
Комп_Оратор)
|
|
03.08.2020, 12:43 | 29 |
Выглядит внушительно. EBCO интересный зверь сам по себе. Внушительно. Скромно говоря. Приятно глазу)
Вообще, дружба простого класса с шаблоном, имеет нюанс. Интересный способ расширения функциональности простого класса.
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
03.08.2020, 12:50 | 30 |
Ну да, становится гораздо проще получить доступ к приватным данным класса. Ну и ладно, они приватные не для супер-секретности.
0
|
Комп_Оратор)
|
|
03.08.2020, 13:19 | 31 |
Кроме того, это возможность "шаблонизировать" интерфейс, оставаясь простым классом. Самый простой и стандартный путь который я знаю - наследования шаблонным классом простого класса. Дружба - вроде более легкий, но ограниченный и ... босяцкий приём. Но есть и симпатичные стороны.
0
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
03.08.2020, 13:30 | 32 |
1
|
Комп_Оратор)
|
|
03.08.2020, 15:52 | 33 |
Как в примере, например. Функции друзья расширяют интерфейс класса. Шаблонные функции позволяют, это делать в стиле шаблонов.
Я задал вопрос о точном знании, пытаясь понять знали ли вы точно, что в постановке ТС задача налетит на рифы на ряде компиляторов. С предложенным вами решением всё получается, по крайней мере, на тройке самых-самых. И решение, основанное на классе, решает вопросы любых методов путём добавления дополнительного уровня косвенного обращения. Обёртки например. С другой стороны интерфейс - настолько тонкий вопрос, как часть инкапсуляции, что написание специального шаблонного класса селектирующего уже существующие шаблоны как классов так и методов (if any), это вполне разумный шаг. oleg-m1973, это просто мысли в слух на заданную тему. Вам плюсы за очень чёткий ответ на старте темы.
0
|
03.08.2020, 15:52 | |
03.08.2020, 15:52 | |
Помогаю со студенческими работами здесь
33
Как объявить другом конкретный метод другого класса? Как объявить friend функцию класса Наследование шаблонного класа Специализация шаблонного класа Как создать метод с использованием объекта другого метода, который определен в другом классе Как вызвать метод из одного класса чтобы он был виден в другом классе?(Отсылка от старой темы) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |