Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
#1

Оператор typename - C++

04.04.2013, 23:54. Просмотров 510. Ответов 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 (C++):

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

шаблоны и typename в частности - C++
Здравствуйте! Я разбираюсь с ассоциативными контейнерами в с++ - делаю лабораторную по ним функция equal_range() одинакова для set,...

Typename перед инстанцированием - C++
В каких случаях перед созданием объекта надо писать typename... И зачем оно там надо? typename hlist::iterator it = cell.begin();

Template<typename T> vs auto - C++
template &lt;typename T&gt; vector&lt;T&gt; my_vec1; vector&lt;auto&gt; my_vec2;Какая разница между содержимым vec1 и vec2?

Typename в шаблонах класса - C++
В таком шаблоне: template &lt;typename T, int n, bool islong=???&gt; class CounterA{... требуется распознать тип, то есть переменная islong...

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

8
Croessmah
Эксперт CЭксперт С++
13416 / 7570 / 855
Регистрация: 27.09.2012
Сообщений: 18,632
Записей в блоге: 3
Завершенные тесты: 1
04.04.2013, 23:57 #2
Алёна C++ - Ключевое слово typename
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2013, 00:04 #3
Можно еще посмотреть, какие ошибки выдает компилятор. Мне кажется, что они достаточно красноречивые.
http://liveworkspace.org/code/dVUs2
0
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:13  [ТС] #4
может я что-то неправильно написал, но компилятор ошибок не выдавал
0
diagon
Higher
1929 / 1195 / 49
Регистрация: 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 / 1
Регистрация: 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
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:36 #7
http://en.wikipedia.org/wiki/Typename
Либо стандарт читай.
P.S. Умножение тут не причем.
0
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:54  [ТС] #8
Именно в статье на википедии опять же умножение. Разве в последнем примере не очевидно, что имеется в виду тип?
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:56 #9
Это могло быть объявление ссылки, а не указателя. Да и это не единственные случаи, когда нужен typename.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2013, 00:56
Привет! Вот еще темы с ответами:

Visual c++ шаблон template <typename TT> - C++
пытаюсь разобраться с шаблонами, но выдает ошибку я даже не знаю куда смотреть https://github.com/Paladin3by/OOP template &lt;typename...

Что означает using typename в шаблоне? - C++
template &lt; typename T &gt; class Class_name { public: using value_type = T; ... что произошло в этом месте?...

Для чего нужен шаблон <typename T> - C++
Здравствуйте. template &lt;typename T&gt; T CLAMP(const T&amp; value, const T&amp; low, const T&amp; high) { return (value &lt; low) ? low : ((value...

typename. Проблемы с вложенными шаблонными типами - C++
Здравствуйте. Реализовываю шаблонный список. /* * List.h */ #pragma once #include &lt;iostream&gt; using namespace std;


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
05.04.2013, 00:56
Ответ Создать тему
Опции темы

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