![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Tiarwe |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 36 Регистрация: 24.8.2011 Репутация: нет Всего: нет |
Здравствуйте!
Есть шаблонный класс. Внутри у него вложенный класс. Требуется создать внутри статический член этого вложенного класса. Пытался так:
Но при компиляции ошибки:
Как можно создать статический экземпляр вложенного в шаблон класса? И возможно ли это вообще? |
||||
|
|||||
| mabrarov |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 12.1.2011 Где: Казань Репутация: 8 Всего: 9 |
Use typename, Luke!
И это еще не создание статического члена, а лишь описание того, как он должен создаваться при специализации шаблонного класса A. |
||||
|
|||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
ты ещё даже класс B не объявил, а уже используешь в объявлении. как я понял. Как я понимаю, С++ уже зашивается 9в силу ряда причин на таких примерах), да и логичней было бы в любом случае экземпляр класса B вынести хотя бы в класс A -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| Lukkoye |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Не верно. Класс B уже известен. Ошибка была в синтаксисе. Правильный ответ во втором сообщении этой темы. |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Угу. Но я, походу, ещё никак С++ 11 не освою. -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Здесь нет кода, который требует функционал C++11 |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Есть. Я даже подноготную рассмотрел 6-летней давности для применения typename и class. Начиная от исторических ссылок, вариантов применения в различных компляторов и тра-ля-ля ещё что-то там. Вообще сам typename и характер его применения сформировался именно на подходе к С++ 11. Я даже с примерами рассмотрел (я не тот чингачгук, который два раза на одни грабли наступает). Вообще, я так понял, что вообще желательно typename пихать в код куда надо и, куда, как, казалось бы, не надо. И маложелательно употреблять class (вроде новомодная тенденция? ) -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| Lukkoye |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 23.3.2013 Репутация: 1 Всего: 1 |
Можно так: http://codepad.org/x2LKMHsw
По поводу использования typename неплохо написала Елена Сагалева в своем блоге: http://alenacpp.blogspot.ru/2006/08/typename.html От себя я могу лишь добавить: на моей практике наиболее частое использование typename - это typedef в шаблонах, при метапрограммировании. Я покажу вам простейший пример: http://rextester.com/CEC63398
Здесь, в зависимости от того, чем будет Т в шаблоне: template<class T>struct Test Его внутренний: typedef typename TSelectIF<T, void, SEmpty,T>::Result_t Type; Будет принимать значение либо SEmpty, либо T Но известно это станет лишь в момент инстанцирования шаблона, а до этого момента, компилятору нужно что-то сделать с этой записью: понять, чему именно сопоставляется имя типа Type: typedef ...что-то-непонятное... Type; Мы указываем typename, давая понять компилятору, что там - некий тип данных, который зависит от параметров родительского шаблона, и поэтому станет известен позже - в момент инстанцирования. Это сообщение отредактировал(а) Lukkoye - 6.1.2014, 22:33 |
||||
|
|||||
| akizelokro |
|
||||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Есть ещё неплохая статья на хабре.
И, не помню уже где, но идёт предположение, что некоторые компиляторы требуют typename даже с некоторой избыточностью. И вами не указаны примеры, навроде "классического", как я понимаю: template <typename T> some_function() { ... typename T::iterator it; // iterator может быть stl-ским итератором, а может быть просто членом класса T ... // простые примеры с разночтениями списков инициализаций и определениями пустых функций } одними typedef применение typename не ограничивается. Просто мы сейчас рассматриваем достаточно простые примеры с шаблонами, например, функций в одну строку. В MSVS этот пример не компилится совсем.
И этот не компилится
А этот вызывает внутренную ошибку компилятора.
Думаю, что struct из-за двоякости их определения (можно указывать struct или нет в ряде выражений, или так мне только кажется), несут известный риск при применении -------------------- a = a + b; b = a - b; a = a - b; |
||||||
|
|||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
я не знаю о чём ты говоришь, никаких изменений касающихся ключевого слова typename в C++11 нет. На заборе тоже написано. Это видимо те же "предполагатели", что к гадалкам ходят. Потому, что это некорректный C++ код. Как он должен компилироваться?
У тебя каша в голове, struct используется только при декларации\определении структуры. Больше его совать никуда не стоит - оно там быть не должно. |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Посмотри эту книгу, там есть всё, что нужно знать про шаблоны. Правда без новшеств, типа variadic templates, но книга всё равно должна помочь в понимании.
Это сообщение отредактировал(а) vinter - 7.1.2014, 08:57 |
|||
|
||||
| akizelokro |
|
||||||||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Не компилится другой пример, а указанный вами как раз и компилится.
Насколько я понял (могу и ошибаться), в C++ 14 будет возможна и инициализация вида struct B { int x = 5, int y = 3; }; или в куче материала я просто увидел такую хотелку, уже прямо так сразу и не вспомнить.
Ну, ещё, отбросив предыдущий, возможно некорректный пример, статические постоянные члены struct могут проинициализированы при декларации/определении. Также инициализацию списком подцепляют и к декларации. Также, осталось и, кажись наследство С в виде
Видел и такие конструкции. А всё что не запрещено, - разрешено. Но в голове каша реальная вырисовывается. Потому ещё не все, как я понял, компиляторы, реализовали полностью нововведения из С++ 11, а тут ещё на подходе С++ 14, который тоже начнут реализовывать в непонятной последовательности пунктов. А за ссылку - спасибо. -------------------- a = a + b; b = a - b; a = a - b; |
||||||||
|
|||||||||
| vinter |
|
||||||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
она уже есть(в C++11). Но у тебя же код, который явно означает определение структуры:
Чтобы это стало инициализацией это должно выглядеть так:
В clang полностью реализован C++14 |
||||||
|
|||||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Каша намечается забавная! Всё-таки в ООП схеме
наследование от С - более азартная вещь, чем 100%-ООП парадигма -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Напрямую сделать это нельзя. Можно сделать статический метод, который содержит объявление статической переменной и возвращает ссылку на нее.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |