Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249

Пояснение по шаблонам2

04.11.2017, 00:22. Показов 2095. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
ISO 14882:2003 14.5.4.3/2

If a member template of a class template is partially specialized, the member template partial specializations
are member templates of the enclosing class template; if the enclosing class template is instantiated
(14.7.1, 14.7.2), a declaration for every member template partial specialization is also instantiated as part of
creating the members of the class template specialization. If the primary member template is explicitly specialized
for a given (implicit) specialization of the enclosing class template, the partial specializations of the
member template are ignored for this specialization of the enclosing class template. If a partial specialization
of the member template is explicitly specialized for a given (implicit) specialization of the enclosing
class template, the primary member template and its other partial specializations are still considered for this
specialization of the enclosing class template.
Не понял каким образом при инстанцировании шаблона класса автоматически инстанцируется шаблонный метод этого класса, и про неявную специализацию очень мутно написано.

Добавлено через 22 минуты
Или инстацирование объявления это такая фигура речи. Вроде как инстанцировали, но понарошку.

Добавлено через 2 часа 27 минут
И почему
Expressions of the following forms are never type-dependent (because the type of the expression cannot be
dependent):
literal
postfix-expression . pseudo-destructor-name
postfix-expression -> pseudo-destructor-name
sizeof unary-expression
sizeof ( type-id )
typeid ( expression )
typeid ( type-id )
::opt delete cast-expression
::opt delete [ ] cast-expression
throw assignment-expressionopt
sizeof выражение срабатывает спокойно от параметра шаблона.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.11.2017, 00:22
Ответы с готовыми решениями:

нужно пояснение по части из курсовой связанной с записями и массивами, напротив вопросов дать пояснение что операторы делают или строчки программы
лучше если конечно дадите по строчное определение что делает программа тут program Cntrl; uses crt; const...

пояснение
у меня есть задание и готовый код к нему. напишите пожалуйста пояснение к коду. срочно помогите! uses crt; function...

Пояснение по this
Доброго времени суток! Кто может на пальцах пояснить предназначение $this и на что ссылается $this и т.д.

36
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 16:47
Студворк — интернет-сервис помощи студентам
Pechkin80, ну попробуй в 4.8.3 переместить поток (fstream, например).
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 16:54  [ТС]
animefan, Ясно, попробую позже. Ну а чем тогда пользоваться ? Шланг или мелкософтовский или comeau купить ?
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 17:19
Цитата Сообщение от notAll Посмотреть сообщение
Начиная с gcc 6.2.0 все компилится
Вопрос в том, должно ли.

Добавлено через 21 минуту
clang вот считает, что нет. И его аргументы выглядят верными.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.11.2017, 17:54
Можно еще и так (на 4.8.3 компилится):
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
 
template <typename T1> class Tgranter2;
 
class TFriendClass
{
public:
    template <typename T1>
    void friend_member(T1& t1)
    {
        t1.privatevar = 5;
    }
 
    template  <typename T1, template< typename > class U>
    void friend_member3(U<T1>& u) {std::cout << u.privatevar2 << "\n";};
 
    template <typename T1>
    void friend_member4(Tgranter2<T1>& t1)
    {
        t1.privatevar2 = 5;
    }
};
 
 
template <typename _T1>
class Tgranter2
{
    _T1 privatevar2 = 42;
 
    friend void TFriendClass::friend_member3<_T1, Tgranter2>(Tgranter2<_T1>&);
 
    template <typename T>
    friend void TFriendClass::friend_member4(Tgranter2<T>&);
};
 
int main()
{
    Tgranter2<int> tg2;
    TFriendClass Tfriend;
    Tfriend.friend_member3(tg2);
    Tfriend.friend_member4(tg2);
    Tfriend.friend_member3(tg2);
}

https://wandbox.org/permlink/eGITFJ5MjdKSBoIh
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 18:09  [ТС]
notAll, У вас какойто удивительный 4.8.3 Частиччная специализация шаблонных методов разве разрешена ?
У меня не компилиться.


C++
1
friend void TFriendClass::friend_member3<_T1, Tgranter2>(Tgranter2<_T1>&);
Полная специализация в пространстве класса ?
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 18:12
Цитата Сообщение от Pechkin80 Посмотреть сообщение
Частиччная специализация шаблонных методов разве разрешена ?
А она есть в коде по последней ссылке?
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 18:15  [ТС]
animefan, В начале показалось, но я так и не понял как интерпритировать:
C++
1
friend void TFriendClass::friend_member3<_T1, Tgranter2>(Tgranter2<_T1>&);
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.11.2017, 18:16
Она не частичная, - friend void TFriendClass::friend_member3<_T1, Tgranter2> - обявление дружкственной функции, которая потом будет инстанциирована в void TFriendClass::friend_member3<int, Tgranter2<int>>
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 18:20  [ТС]
notAll, О как. Был шаблонный метод шаблонного класса и бац уже незвергли до просто функции. Ну если такое вот инстанцирование допустимо то вопросов нет. Но у меня ругается

C++
1
2
3
4
5
6
7
8
9
template <typename _T1>
class Tgranter2
{
    int privatevar2 = 55;
    //template  <typename T1>
    friend void TFriendClass::friend_member3<_T1,Tgranter2<_T1> >(Tgranter2<_T1>& t1);
    template <typename T2>
    friend void TFriendClass::friend_member4(Tgranter2<T2>& t1);
};
C:\MySoftware\study_cpp\test7\templates\ friends.h:62: ошибка: template-id 'friend_member3<int, Tgranter2<int> >' for 'void TFriendClass::friend_member3(Tgranter2<i nt>&)' does not match any template declaration
friend void TFriendClass::friend_member3<_T1,Tgrante r2<_T1> >(Tgranter2<_T1>& t1);
^
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 18:24
Цитата Сообщение от notAll Посмотреть сообщение
Можно еще и так (на 4.8.3 компилится):
А в clang опять нет. Правда, в отличие от предыдущего случая, где довольно легко видно, что clang прав, тут я не разобрался пока.

Цитата Сообщение от Pechkin80 Посмотреть сообщение
Был шаблонный метод шаблонного класса
Класс не шаблонный.
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 18:27  [ТС]
animefan, Виноват, но в идеале и он должен быть шаблонный. Я просто рассматриваю как мне кажется обычную ситуация когда два шаблонных класса хотя подружиться не классами, а методами классов.
Пока для простоты один из классов не шаблонный.
0
495 / 209 / 70
Регистрация: 27.05.2016
Сообщений: 557
12.11.2017, 18:27
Pechkin80, без Tgranter2<_T1>, - второй параметр шаблона TFriendClass::friend_member3 - шаблонный шаблонный параметр. Должно быть так: friend_member3<_T1, Tgranter2>
1
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 18:39  [ТС]
notAll, Скомпилировалось, но как это интерпритировать по прежнему загадка. Да мне понятно что это объявление дружественного шаблонного члена класса, но тут не только это, так как объявление отличается от primary template member.

Добавлено через 6 минут
animefan, А какую ошибку шланг выдаёт ? Его сайт лежит, поэтому щас не могу посмотреть.
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 18:40
Цитата Сообщение от Pechkin80 Посмотреть сообщение
А какую ошибку шланг выдаёт ? Его сайт лежит, поэтому щас не могу посмотреть.
Зачем тебе сайт шланга? https://wandbox.org/permlink/OHSKfeUNVDykg8Cv
1
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
12.11.2017, 21:43  [ТС]
Если вдруг кому нибудь будет интересно, возможная интерпретация выделена жирным:
A friend of a class or class template can be a function template or class template, a specialization of a
function template or class template, or an ordinary (non-template) function or class. For a friend function
declaration that is not a template declaration
:
if the name of the friend is a qualified or unqualified template-id, the friend declaration refers to a
specialization of a function template
, otherwise
— if the name of the friend is a qualified-id and a matching non-template function is found in the specified
class or namespace, the friend declaration refers to that function, otherwise,
— if the name of the friend is a qualified-id and a matching function template is found in the specified
class or namespace, the friend declaration refers to the deduced specialization of that function
template (14.8.2.6), otherwise,
— the name shall be an unqualified-id that declares (or redeclares) an ordinary (non-template) function.
Похоже так как не декларация шаблона (template <typename T1> - отсутствует)
C++
1
2
//template  <typename T1>
    friend void TFriendClass::friend_member3<_T1,Tgranter2<_T1> >(Tgranter2<_T1>& t1);
Добавлено через 6 минут
Но присутствует qualified template-id
0
 Аватар для animefan
119 / 9 / 2
Регистрация: 06.09.2017
Сообщений: 82
12.11.2017, 22:14
Pechkin80, это всё просто.

Непонятно, почему clang не хочет компилировать код. Вроде должен.
Цитата Сообщение от http://eel.is/c++draft/temp.inst#2
The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, but not of the definitions, default arguments, or noexcept-specifiers of the class member functions, member classes, scoped member enumerations, static data members, member templates, and friends;
0
21 / 19 / 7
Регистрация: 14.03.2014
Сообщений: 249
13.11.2017, 03:15  [ТС]
animefan, Я решил добавить хоррора в код. Вот это должно обрадовать шлангопочитателей:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "iostream"
 
template <typename T1> class Tgranter3;
 
template <typename _T1>
class TFriendClass2
{
public:
    template <typename T1>
    void friend_member(T1& t1)
    {
        t1.privatevar2 = 5;
    }
    // Ошибка компиляции
    /*
     \friends.h:53: ошибка: prototype for 'template<class T1, template<class> class typedef U U> void TFriendClass::friend_member3(Tgranter2<int>&)' does not match any in class 'TFriendClass'
     friend void TFriendClass::friend_member3(Tgranter2<_T1>& t1);
                 ^
     */
    template  <typename T1, template< typename > class U>
    void friend_member3(U<T1>& t1)
    {
        t1.privatevar2 = 5;
    }
    // Плохое решение, так как нарушает SOLID
    template <typename T1>
    void friend_member4(Tgranter3<T1>& t1)
    {
        t1.privatevar2 = 5;
    }
};
 
template <typename _T1>
class Tgranter3
{
    int privatevar2 = 55;
    // Работает на mingw 4.8.3 и gcc 6.2.0 , но не работает на clang
    friend void TFriendClass2<_T1>::friend_member3<_T1,Tgranter3 >(Tgranter3<_T1>& t1);
    //------------------------------------------------------
    // Работает на gcc 6.2.0 и clang, но не работает на mingw 4.8.3
    //template  <typename T2, template< typename > class U>
    //friend void TFriendClass2::friend_member3(U<T2>& t1);
    //------------------------------------------------------
    // Плохое решение, так как нарушает SOLID
    template <typename T1>
    template <typename T2>
    friend void TFriendClass2<T1>::friend_member4(Tgranter3<T2>& t1);
    //------------------------------------------------------
    // Плохое решение, так T1 не может быть шаблонным классом,
    // а значит дружественный метод дефакто
    // не получит доступ к полям класса.
    template <typename T1>
    template <typename T2>
    friend void TFriendClass2<T1>::friend_member(T2 & t1);
};
 
int main(int argc, char *argv[])
{
    TFriendClass2<int> fr2;
    Tgranter3<int> gr3;
    fr2.friend_member3(gr3);
    fr2.friend_member4(gr3);
    return 0;
}
Тут обратная ситуация. Шланг проглатывает, а gcc плюётся.

Добавлено через 2 часа 0 минут
Ещё прикол:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
 
template <typename T1> class Tgranter2;
 
template <typename T1,template <typename> class U>
    void friend_member4(U<T1>& t1)
{
    t1.privatevar2 = 5;
}
 
 
template <typename _T1>
class Tgranter2
{
    int privatevar2 = 42;
 
    template  <typename T1 = _T1, template <typename> class U>
    friend void friend_member4(U<T1>&);
};
 
int main()
{
    Tgranter2<int> tg2;
    friend_member4(tg2);
}
Шланг плюётся и правильно делает, так как это криминал, gcc 6.2.0 проглатывает.

Добавлено через 5 минут
gcc 4.8.3 честно предупреждает:

prog.cc:31:51: error: default argument for template parameter for class enclosing 'void TFriendClass::friend_member3(U<T>&)'
friend void TFriendClass::friend_member3(U<T>&);
Добавлено через 26 минут
Прошу прощения. В некоторых местах комментарии не соответсвуют коду (для старой версии писались.)
Вот обновления:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
template <typename T1> class Tgranter3;
 
template <typename _T1>
class TFriendClass2
{
public:
    template <typename T1>
    void friend_member(T1& t1)
    {
        t1.privatevar2 = 5;
    }
    // Ошибка компиляции
    /*
     \friends.h:53: ошибка: prototype for 'template<class T1, template<class> class typedef U U> void TFriendClass::friend_member3(Tgranter2<int>&)' does not match any in class 'TFriendClass'
     friend void TFriendClass::friend_member3(Tgranter2<_T1>& t1);
                 ^
     */
    template  <typename T1, template< typename > class U>
    void friend_member3(U<T1>& t1)
    {
        t1.privatevar2 = 5;
    }
    // Плохое решение, так как нарушает SOLID
    template <typename T1>
    void friend_member4(Tgranter3<T1>& t1)
    {
        t1.privatevar2 = 5;
    }
};
 
template <typename _T1>
class Tgranter3
{
    int privatevar2 = 55;
    // Не Работает на mingw 4.8.3 и gcc 6.2.0 , но работает на clang
    //friend void TFriendClass2<_T1>::friend_member3<_T1,Tgranter3 >(Tgranter3<_T1>& t1);
    //------------------------------------------------------
    // Не Работает на mingw 4.8.3 и clang, но работает на gcc 6.2.0
    template <typename T1>
    template  <typename T2, template< typename > class U>
    friend void TFriendClass2<T1>::friend_member3(U<T2>& t1);
    //------------------------------------------------------
    // Плохое решение, так как нарушает SOLID
    template <typename T1>
    template <typename T2>
    friend void TFriendClass2<T1>::friend_member4(Tgranter3<T2>& t1);
    //------------------------------------------------------
    // Плохое решение, так T1 не может быть шаблонным классом,
    // а значит дружественный метод дефакто
    // не получит доступ к полям класса.
    template <typename T1>
    template <typename T2>
    friend void TFriendClass2<T1>::friend_member(T2 & t1);
};
 
int main(int argc, char *argv[])
{
    TFriendClass2<int> fr2;
    Tgranter3<int> gr3;
    fr2.friend_member3(gr3);
    fr2.friend_member4(gr3);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2017, 03:15
Помогаю со студенческими работами здесь

Пояснение
Кто может помочь написать пояснение к строкам этой программы ? Правила форума п. 5.18 Код перепечатайте руками в тему!

Пояснение
Доброго времени суток! Для чего это? Это как то будет отображаться в режиме 1С Предприятие?

Пояснение
Препод-редиска,говорит объясни мне каждую строчку,а я как четвероногий друг:понимаю но объяснить не могу,поэтому обращаюсь к знающим...

пояснение к коду
помогите пожалуйста. напишите поянение к коду. var f1, f2 : text; s : string; i : integer; flagEnd : boolean; begin ...

Пояснение кода
Кто знает,поясните пожалуйста код :) using System; using System.Collections; using System.Collections.Generic; using System.IO; ...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru