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

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

Восстановить пароль Регистрация
 
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
04.04.2013, 23:54     Оператор typename #1
Здравствуйте. Делал недавно небольшую программку и столкнулся с одной интересной штукой. Суть примерно такая
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 перед типом возвращаемого значения? Я знаю, что данный оператор уточняет, что далее идёт тип данных, но какие тут могут быть сомнения у компилятора?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
04.04.2013, 23:57     Оператор typename #2
Алёна C++ - Ключевое слово typename
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2013, 00:04     Оператор typename #3
Можно еще посмотреть, какие ошибки выдает компилятор. Мне кажется, что они достаточно красноречивые.
http://liveworkspace.org/code/dVUs2
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:13  [ТС]     Оператор typename #4
может я что-то неправильно написал, но компилятор ошибок не выдавал
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
05.04.2013, 00:22     Оператор typename #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).
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:23  [ТС]     Оператор typename #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 последнего не компилируется. Только здесь уже вряд ли можно перепутать с умножением. Больше интересуюсь этой ситуацией.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:36     Оператор typename #7
http://en.wikipedia.org/wiki/Typename
Либо стандарт читай.
P.S. Умножение тут не причем.
Большой_Стен
13 / 13 / 1
Регистрация: 22.04.2012
Сообщений: 99
05.04.2013, 00:54  [ТС]     Оператор typename #8
Именно в статье на википедии опять же умножение. Разве в последнем примере не очевидно, что имеется в виду тип?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2013, 00:56     Оператор typename
Еще ссылки по теме:

C++ Шаблоны. Что лучше <class T> или <typename T>?
C++ Template<typename T> vs auto
C++ Как програмно показать разницу между typename и class в шаблонных классах?

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

Или воспользуйтесь поиском по форуму:
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
05.04.2013, 00:56     Оператор typename #9
Это могло быть объявление ссылки, а не указателя. Да и это не единственные случаи, когда нужен typename.
Yandex
Объявления
05.04.2013, 00:56     Оператор typename
Ответ Создать тему
Опции темы

Текущее время: 17:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru