Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105

Способы объявления шаблона

12.08.2015, 03:28. Показов 5657. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Возникли непонятки в ходе изучения шаблонов. Взглянем на код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
template <typename T>
void Func(T value)
{
  cout << value << "\n";
}
 
int main()
{
  int a = 5;
  Func <int> (5);
  return 0;
}
Результат: 5.

Прикол в том, что если строку 5 изменить следующим образом:
C++
1
template <class T>
, то в ходе выполнения программы совершенно ничего не меняется, оба варианта компилируются и выдают одинаковый результат. Так в чём же тогда разница между следующими объявлениями:
C++
1
2
template <typename T>
template <class T>
???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2015, 03:28
Ответы с готовыми решениями:

Все виды(способы) объявления переменных, функций, классов, типов и т.п. на С++
Пишу обфускатор кода, написанного на С++ и появилась необходимость знания всевозможных способов объявления чего-либо на С++. Так как...

Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.
Используя одну переменную цикла укажите возможные способы объявления заголовка счетного цикла.

Какие есть способы объявления аргументов функций?
Например было какое то объявление procedure myproc(var f:File), вместо myproc(f:File). Чем они отличаются и есть ли другие типы функций...

21
 Аватар для smartpointer
70 / 64 / 40
Регистрация: 17.02.2014
Сообщений: 265
12.08.2015, 03:34
Лучший ответ Сообщение было отмечено Ilot как решение

Решение

Оба объявления эквивалентны - используйте то, что удобнее для вас.
1
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
12.08.2015, 03:40  [ТС]
Благодарю!
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.08.2015, 09:30
Лучший ответ Сообщение было отмечено BumerangSP как решение

Решение

Цитата Сообщение от Alexey104 Посмотреть сообщение
Так в чём же тогда разница между следующими объявлениями:
C++
1
2
template <typename T>
template <class T>
Когда Страуструп вводил шаблоны, то пожадничал ввести новое ключевое слово и применил существующее - class.
Когда же ввели новое ключевое слово typename (для других целей), то разрешили его и здесь использовать как более подходящее.
Вот у Алены про это. Из этой записи видно, что в этом качестве новое ключевое слово не сразу прижилось.
1
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
12.08.2015, 09:37
Alexey104, кстати говоря, при вызовах функциональных шаблонов не обязательно указывать точный тип шаблона. Типы переменных выводятся сами. Так что вызов функции можно оформить классически:
C++
1
Func(5);
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 10:05
Цитата Сообщение от Alexey104 Посмотреть сообщение
Так в чём же тогда разница между следующими объявлениями:
технически разницы нет никакой.

однако, 'typename' обозначает тип (любой, например - int)
в то время, как 'class' предполагает что T - это все таки именно какой то класс,
или структура.

в итоге, некоторые люди используют всегда 'class'.
другие - всегда 'typename'

а некоторые, как я:
использую 'typename', если шаблон рассчитан для работы с любыми типами,
либо 'class' если ожидаются только пользовательские типы.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
12.08.2015, 10:11
Однако, стоит отметить, что если параметр шаблона сам по себе является шаблоном, то там синтаксис требует class:
template < template-parameter-list > class ..._opt identifier_opt
То есть в
C++
1
template < template <typename> class TT >
typename вместо class не прокатит.
1
12.08.2015, 10:18

Не по теме:

Croessmah, Пока да, однако в С++1z будет можно и typename.

0
12.08.2015, 10:20

Не по теме:

ForEveR, можно ссылочку на источник? :)

0
12.08.2015, 10:23

Не по теме:

ForEveR, уже нашел. Да, в новом черновике так:

template < template-parameter-list > type-parameter-key ...opt identifieropt

0
12.08.2015, 10:38

Не по теме:

Croessmah, эта штука кстати реализована в gcc и clang. Так что уже можно пользоваться. Даже без ключа с++1z будет всего лишь ворнинг, не ошибка.

0
12.08.2015, 10:41

Не по теме:

ct0r, warning тоже не приятен :) тем более, у меня чаще всего -pedantic-errors

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 11:06
Цитата Сообщение от Croessmah Посмотреть сообщение
typename вместо class не прокатит.
эээ, не понял...

http://rextester.com/EVJGFY86580

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
 
template < template <typename> class TT >
    struct foo{};
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo<std::allocator> d;
}
Добавлено через 54 секунды
Цитата Сообщение от ct0r Посмотреть сообщение
эта штука кстати реализована в gcc и clang. Так что уже можно пользоваться. Даже без ключа с++1z будет всего лишь ворнинг, не ошибка.
чет я не вижу никаких ворнингов.
а роббит это и в студийном компиляторе тоже
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.08.2015, 11:07
hoggy, Не тот кейс.
Попробуй
C++
1
template<template <typename> typename TT>
1
12.08.2015, 12:12

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
однако в С++1z будет можно и typename.
Уже не удастся блеснуть знаниями тонкостей в различиях class/typename :D

0
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
12.08.2015, 19:37  [ТС]
Всем спасибо за участие!
Тему усёк.

Добавлено через 2 часа 6 минут
Хотелось бы вернуться к вопросу. Увидел в некоторых кодах что-то типа этого:
C++
1
template <int x>
Что сие означает, не подскажете?
Желательно с простенькими примерами.

Добавлено через 1 час 17 минут
С этим разобрался, проехали. Появился новый вопрос:
при попытке откомпилировать код, содержащий шаблон с параметрами по умолчанию, gcc выдаёт следующее сообщение:

ошибка: default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11

Что такое '-std=c++11' и '-std=gnu++11' ?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.08.2015, 20:10
Цитата Сообщение от Alexey104 Посмотреть сообщение
Что такое '-std=c++11' и '-std=gnu++11' ?
Ключи компилятора для включения поддержки нового стандарта С++.

Добавлено через 48 секунд
Цитата Сообщение от Alexey104 Посмотреть сообщение
при попытке откомпилировать код, содержащий шаблон с параметрами по умолчанию
Раньше в С++ нельзя было делать шаблонные параметры по умолчанию у функций.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 20:11
Цитата Сообщение от Alexey104 Посмотреть сообщение
при попытке откомпилировать код, содержащий шаблон с параметрами по умолчанию, gcc выдаёт следующее сообщение:
ошибка: default template arguments may not be used in function templates without -std=c++11 or -std=gnu++11
Что такое '-std=c++11' и '-std=gnu++11' ?
это - ключи компиляции.
они сообщают компилятору, что необходима поддержка с++11.
(относительно новый стандарт языка)


дело в том, что в более ранних версиях стандарта,
параметры по умолчанию для функций не поддерживались.
их поддержка началась с с++11.

компилятор говорит вам: вы не указали эти ключи,
а значит он пытается компилировать по более раннему стандарту, и там это не работает.

если хотите, что бы работало, нужно указать ключик.
1
 Аватар для Alexey104
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
13.08.2015, 18:53  [ТС]
Спасибо, добрые Люди!
С ключиками компилируется успешно.

Добавлено через 22 часа 39 минут
В очередной раз возвращаясь к вопросу:
Интересна данная возможность языка:
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
template < template <typename> class TT >
Что-то у меня мозгов не хватает, чтобы разобраться с этим самостоятельно. Пытаюсь откомпилировать нечто вроде:
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
#include <iostream>
 
using namespace std;
 
template <typename T, typename TT>
class Object1
{
  private:
    T itsVal;
    TT itsVal2;
  public:
    Object1(T value, TT value2): itsVal(value), itsVal2(value2) {}
    void Show() const 
    {cout << "Object1 val:\t" << itsVal << "\n" << "Object1 val2:\t" << itsVal2 << "\n";}
};
 
template <typename T, template <typename, typename> class C>
class Object2
{
  private:
    T itsVal;
    C <int, int> itsObj;
  public:
    // Не уверен в правильности реализации конструктора:
    Object2(T value, C <int, int> object): itsVal(value), itsObj(object) {}
    void Show() const 
    {cout << "Object2 val:\t" << itsVal << "\n" << "Object2 С:\t" << itsObj << "\n";}
};
 
 
 
int main()
{
  Object1 <int, int> theObject1(2, 4);
  theObject1.Show();
  
  //Здесь у меня проблемы:
  //Object2 <int, Object1 <int, int>> theObject2(12, Object1(4,5));
    
  return 0;
}
Объект класса 'Object1' создаётся успешно, но я никак не могу понять, каков должен быть синтаксис при создании объекта класса 'Object2', одна из переменных-членов которого является шаблоном класса 'Object1'. Как бы я ни извращался со строкой 38, компилятор матерится и оскорбляет меня.)

Как создать объект класса 'Object2', содержащий конкретизированный шаблон класса 'Object1' в качестве переменной-члена?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.08.2015, 18:57
C++
1
2
3
4
5
6
7
8
9
10
11
12
template <typename T, template <typename, typename> class C>
class Object2
{
  private:
    T itsVal;
    C <int, int> itsObj;
  public:
    // Не уверен в правильности реализации конструктора:
    Object2(T value, C <T, T> object): itsVal(value), itsObj(object) {}
    void Show() const 
    {cout << "Object2 val:\t" << itsVal << "\n" << "Object2 С:\t" << itsObj << "\n";}
};
C++
1
Object2 <int, Object1> theObject2(12, Object1<int, int>(4,5));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2015, 18:57
Помогаю со студенческими работами здесь

Какие способы самые удобные/рациональные способы регистрации ошибок есть?
Задался вопросом, а как регистрировать ошибки? При этом чтобы и выглядело это красиво, и понятно было, и компактно. Заводить переменную...

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. Ничего удивительного, учитывая то, ...

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { ...

Редактирование шаблона сайта и шаблона письма
Помогите найти , где и как ? Т.е. уже 3 дня роюсь и не в состоянии найти где убить пару кнопок и поменять логотип и где редактировать...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru