![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Допустим, есть шаблонный класс обобщенной полилинии:
Здесь _Tp - тип вершины, а _Cont - контейнер, в котором вершины хранятся, по умолчанию - вектор. Дальше, объявляем специальный контейнер:
и объявляем специализированный шаблон полилинии с этим контейнером:
Пока все хорошо. Траблы начинаются, когда (внутри объявления класса) я пытаюся написать typedef poly_base <_Vert, CVcdPolyRef> base_class; На эту строку компилятор ругается так: error C3200: 'CVcdPolyRef<_Vert,_Alloc>' : invalid template argument for template parameter '_Cont', expected a class template Можно подумать, я ему не template подсовываю... В 2003 это все нормально компилируется и работает... Вопрос, как обойти. base_class нужен для 2 вещей: во-первых, объявить в классе производные типы (там их море). Но здесь я выкрутилась. А вот как вызвать конструктор базового класса из конструктора шаблона CVcdPolyBase (если мне нужен конструктор с параметром)? Прямая подстановка вместо base_class - poly_base <_Vert, CVcdPolyRef> - не катит - та же ошибка C3200. Понятно, что base_class, который я пытаюсь объявить, не совсем тип, а все-таки шаблон. В 2008 ужесточили синтаксис, подогнав ближе к стандарту, тоже понятно. Но что делать-то в данной ситуации? Есть идеи? Т.е. я, конечно, выкрутилась, но очень через ж... Хотелось бы понять, как правильно. -------------------- ... |
||||||
|
|||||||
azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
может так? подозреваю, что это все таки проблема в студии, ибо ведет она себя мягко говоря некорректно. тот же typedef где нибудь в другом месте замечательно компилируется
если заменить CVcdPolyRef на что либо другоето код снова компилируется скажем так
а теперь кое что поинтереснее
попробуй вот так ![]() или в конце концов вот так
но в любом случае я бы сделал так, как показал в начале поста, у класса может быть много наследников, зачем в каждом из них определять базовый тип, пусть он будет определен в базовом. Это сообщение отредактировал(а) azesmcar - 20.8.2010, 16:23 |
||||||||||
|
|||||||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не поняла, в начале - это typedef poly_base <_Tp, _Cont, _Alloc> this_type; ? Но по-моему, это неправильно - _Alloc это аргумент контейнера, а не третий аргумент шаблона... Остальное сейчас попробую, хотя что-то похожее вроде пробовала (с namespace). Добавлено через 5 минут и 59 секунд Вау! Я кое-что опустила вначале - вся эта хрень сама по себе находится в своем пространстве имен - Vcd. Как только ставлю Vcd::CVcdPolyRef - компилируется! Убираю - фиг вам. Все-таки глюк.. Спасибо azesmcar! Пошла выковыривать обходы через ж... -------------------- ... |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Но ведь класс base принимает 3 шаблонных параметра - три и передаем в typedef-е, конечно, можно и два, но тогда третий будет всегда по умолчанию. Да, я так понял студия тут путается, и подставляет в аргумент шаблона вместо имени класса что-то другое..но вот что? Путается она вот тут
![]() Пожалуйста ![]() Кстати, не стоит так называть переменные/типы итд...это зарезервированные имена
Это сообщение отредактировал(а) azesmcar - 20.8.2010, 17:45 |
||||||
|
|||||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
А, да, действительно, об аллокаторе я как-то забыла... Он и всунут-то туда был, чтобы вектор можно было использовать...
так вроде у меня нет двух underscore, и не начинается с них
Действительно, вопрос интересный - CVcdPolyRef нигде не дублируется, проверяла. Обидно, что глюк привнесенный - ведь в 2003 все нормально компилировалось. Переписали, блин, компилятор. Прямо как мы - одну ошибку правим, 2 новых добавляем... -------------------- ... |
||||
|
|||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Я про эти имелось ввиду т.е. имена, которые содержат двойное подчеркивание или начинаются с подчеркивания и заглавной буквы. У Саттера в More Exceptional C++ была глава посвященная этому, сейчас попробую найти. добавлено По поводу ГЛАВЫ я конечно погорячился, но достаточно красочно описано ![]()
http://www.gotw.ca/gotw/085.htm
В 2010-ой тоже самое. Это сообщение отредактировал(а) azesmcar - 20.8.2010, 19:52 |
||||||
|
|||||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Да, действительно... но это аргументы шаблона, и их действие неглубоко, и код довольно старый, давно живут. Мне там столько всего править для перехода, что то, что нормально компилируется, трогать не буду. Кстати, мелкософт может захапать под стандартное и без всякого подчеркивания имена - помнится, при переходе 6 -> 2003 сталкивалась, так что не угадаешь. Да и не такая это проблема, по крайней мере, чтобы так эмоционально как Саттер описывать... -------------------- ... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |