![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Пример, иллюстрирующий проблему:
Виновника нашел - struct SomeStruct. Если ее вынести из SomeClass, то все работает. Но, мне совершенно не нужно выносить эту структуру за пределы класса. И вообще, она у меня приватная. ![]() Из подсказки следует, что в строке 29 надо использовать ключевое слово "typename". Попробовал - помогло. Но мне это не нравится, почему компилятор счел Container нетипом (non-type)? И как сделать так, чтобы он считал его типом без использования typename? |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Это стандарт. Никуда не деться. Компилятор не может быть уверен, что SegS::Container есть всегда тип. Поэтому ему и нужно дополнительное разъяснение. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
интересно, а с чем он его перепутать может? Больше же вариантов нет!
с другой стороны, почему работает без typename, если вынести определение SomeStruct за пределы класса? |
|||
|
||||
Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Можно написать специализацию при которой SegS::Container будет именем переменной.
Это уже интересней. Надо обратиться к библии. Скорей всего, что-то с резолвингом зависимых имен связано... Добавлено @ 22:38 Первое что пришло в голову, это то что SomeStruct ведь тоже при специализции может перестать быть типом... |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Это как?!? В качестве специализации указать не тип, а переменную?!? |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ясно
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Трехэтажные объявления при работе с шаблонами - обычное дело. Спасают только typedef'ы, скажем:
Вопрос, почему компилятор то требует typename, то нет, это скорее всего, его личные тараканы. По моему, всегда должен. -------------------- ... |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Не, тут всё верно. Смотрите: SomeStruct – это не что иное, как SomeClass<T>::SomeStruct, т.е. зависимый от T тип. Стало быть, Segment<SomeStruct> – это также зависимый от T тип. В таком случае для Segment<SomeClass<T>::SomeStruct>::Container по стандарту полагается прописывать typename. Если же мы выносим SomeStruct за пределы шаблонного класса SomeClass, то теперь SomeStruct становится конкретным (ни от чего не зависящим) типом. Стало быть, Segment<SomeStruct> – это тоже конкретное имя и теперь для обращения Segment<SomeStruct>::Container подсказывать компилятору уже ничего не нужно. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |