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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Возникли непонятки в ходе изучения шаблонов. Взглянем на код:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.08.2015, 03:28
Ответы с готовыми решениями:

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

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

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

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

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

Решение

Оба объявления эквивалентны - используйте то, что удобнее для вас.
1
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
12.08.2015, 03:40  [ТС] 3
Благодарю!
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
12.08.2015, 09:30 4
Лучший ответ Сообщение было отмечено 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 5
Alexey104, кстати говоря, при вызовах функциональных шаблонов не обязательно указывать точный тип шаблона. Типы переменных выводятся сами. Так что вызов функции можно оформить классически:
C++
1
Func(5);
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 10:05 6
Цитата Сообщение от Alexey104 Посмотреть сообщение
Так в чём же тогда разница между следующими объявлениями:
технически разницы нет никакой.

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

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

а некоторые, как я:
использую 'typename', если шаблон рассчитан для работы с любыми типами,
либо 'class' если ожидаются только пользовательские типы.
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
12.08.2015, 10:11 7
Однако, стоит отметить, что если параметр шаблона сам по себе является шаблоном, то там синтаксис требует class:
template < template-parameter-list > class ..._opt identifier_opt
То есть в
C++
1
template < template <typename> class TT >
typename вместо class не прокатит.
1
ForEveR
12.08.2015, 10:18
  #8

Не по теме:

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

0
Croessmah
12.08.2015, 10:20
  #9

Не по теме:

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

0
Croessmah
12.08.2015, 10:23
  #10

Не по теме:

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

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

0
ct0r
12.08.2015, 10:38
  #11

Не по теме:

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

0
Croessmah
12.08.2015, 10:41
  #12

Не по теме:

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

0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 11:06 13
Цитата Сообщение от 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.08.2015, 11:07 14
hoggy, Не тот кейс.
Попробуй
C++
1
template<template <typename> typename TT>
1
Tulosba
12.08.2015, 12:12
  #15

Не по теме:

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

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

Добавлено через 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
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
12.08.2015, 20:10 17
Цитата Сообщение от Alexey104 Посмотреть сообщение
Что такое '-std=c++11' и '-std=gnu++11' ?
Ключи компилятора для включения поддержки нового стандарта С++.

Добавлено через 48 секунд
Цитата Сообщение от Alexey104 Посмотреть сообщение
при попытке откомпилировать код, содержащий шаблон с параметрами по умолчанию
Раньше в С++ нельзя было делать шаблонные параметры по умолчанию у функций.
1
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.08.2015, 20:11 18
Цитата Сообщение от 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
4 / 4 / 0
Регистрация: 26.10.2014
Сообщений: 105
13.08.2015, 18:53  [ТС] 19
Спасибо, добрые Люди!
С ключиками компилируется успешно.

Добавлено через 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
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
13.08.2015, 18:57 20
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
13.08.2015, 18:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2015, 18:57
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru