Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Большой_Стен
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
#1

Оператор typename

04.04.2013, 23:54. Просмотров 609. Ответов 8
Метки нет (Все метки)

Здравствуйте. Делал недавно небольшую программку и столкнулся с одной интересной штукой. Суть примерно такая
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T1, class T1>
class A
{
    public:
    class B
    {
        
    };
    B* var;
    B* fun();
};
 
template <class T1, class T1>
typename A<T1,T2>::B* A<T1,T2>::fun () {}
В коде нет ошибок, смущает лишь зачем при определении тела функции использовать typename перед типом возвращаемого значения? Я знаю, что данный оператор уточняет, что далее идёт тип данных, но какие тут могут быть сомнения у компилятора?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2013, 23:54
Ответы с готовыми решениями:

Typename и Class
Между записью template &lt;class T&gt; и template &lt;typename T&gt; нет никакой разницы?

Typename перед инстанцированием
В каких случаях перед созданием объекта надо писать typename... И зачем оно там...

Зависимые имена и typename
Не пойму логику зависимых имён. может кто подскажет. вот есть такой пример: ...

Template<typename T> vs auto
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница...

Typename в шаблонах класса
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class...

8
Croessmah
++Ͻ
14491 / 8272 / 1553
Регистрация: 27.09.2012
Сообщений: 20,317
Записей в блоге: 3
Завершенные тесты: 1
04.04.2013, 23:57 #2
Алёна C++ - Ключевое слово typename
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2013, 00:04 #3
Можно еще посмотреть, какие ошибки выдает компилятор. Мне кажется, что они достаточно красноречивые.
http://liveworkspace.org/code/dVUs2
0
Большой_Стен
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:13  [ТС] #4
может я что-то неправильно написал, но компилятор ошибок не выдавал
0
diagon
Higher
1937 / 1203 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2013, 00:22 #5
Цитата Сообщение от Большой_Стен Посмотреть сообщение
может я что-то неправильно написал, но компилятор ошибок не выдавал
Это от компилятора зависит.

Цитата Сообщение от Большой_Стен Посмотреть сообщение
но какие тут могут быть сомнения у компилятора?
В общем-то, тут все достаточно однозначно. Интеловский компилятор спокойно компилирует ваш код. Однако, стандарт есть стандарт.
When a qualified-id is intended to refer to a type that is not a member of the current instantiation (14.6.2.1)
and its nested-name-specifier refers to a dependent type, it shall be prefixed by the keyword typename, forming
a typename-specifier. If the qualified-id in a typename-specifier does not denote a type, the program is illformed.
То есть компилятор не обязан догадываться о ваших намерениях и может просто отказаться компилировать ваш код(что и делают gcc и clang).
0
Большой_Стен
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:23  [ТС] #6
Статью Алёны С++ изучил. Понял, что идёт путаница с умножением. Просто в примере забыл typename случайно (у меня самого он стоит). Но теперь усложним задачу - добавим умные указатели из boost
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T1, class T1>
class A
{
    public:
    class B
    {
        
    };
    boost::shared_ptr<B> var;
    boost::shared_ptr<B>  fun();
};
 
template <class T1, class T1>
boost::shared_ptr<typename A<T1,T2>::B> A<T1,T2>::fun () {}
У меня без typename последнего не компилируется. Только здесь уже вряд ли можно перепутать с умножением. Больше интересуюсь этой ситуацией.
0
Герц
525 / 342 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:36 #7
http://en.wikipedia.org/wiki/Typename
Либо стандарт читай.
P.S. Умножение тут не причем.
0
Большой_Стен
13 / 13 / 8
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:54  [ТС] #8
Именно в статье на википедии опять же умножение. Разве в последнем примере не очевидно, что имеется в виду тип?
0
Герц
525 / 342 / 12
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:56 #9
Это могло быть объявление ссылки, а не указателя. Да и это не единственные случаи, когда нужен typename.
0
05.04.2013, 00:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2013, 00:56

шаблоны и typename в частности
Здравствуйте! Я разбираюсь с ассоциативными контейнерами в с++ - делаю...

В чем отличие typename от class?
Зачем нужно typename В чем отличие от class ?

Visual c++ шаблон template <typename TT>
пытаюсь разобраться с шаблонами, но выдает ошибку я даже не знаю куда смотреть...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru