| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > шаблонный аргумент шаблона |
| Автор: Earnest 20.8.2010, 15:39 | ||||||
Допустим, есть шаблонный класс обобщенной полилинии:
Здесь _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 20.8.2010, 15:56 | ||||||||||
может так? подозреваю, что это все таки проблема в студии, ибо ведет она себя мягко говоря некорректно. тот же typedef где нибудь в другом месте замечательно компилируется
если заменить CVcdPolyRef на что либо другоето код снова компилируется скажем так
а теперь кое что поинтереснее
попробуй вот так или в конце концов вот так
но в любом случае я бы сделал так, как показал в начале поста, у класса может быть много наследников, зачем в каждом из них определять базовый тип, пусть он будет определен в базовом. |
| Автор: azesmcar 20.8.2010, 17:31 | ||||||||
Но ведь класс base принимает 3 шаблонных параметра - три и передаем в typedef-е, конечно, можно и два, но тогда третий будет всегда по умолчанию.
Да, я так понял студия тут путается, и подставляет в аргумент шаблона вместо имени класса что-то другое..но вот что? Путается она вот тут
Пожалуйста Кстати, не стоит так называть переменные/типы итд...это зарезервированные имена
|
| Автор: Earnest 20.8.2010, 19:04 | ||||
А, да, действительно, об аллокаторе я как-то забыла... Он и всунут-то туда был, чтобы вектор можно было использовать...
так вроде у меня нет двух underscore, и не начинается с них
Действительно, вопрос интересный - CVcdPolyRef нигде не дублируется, проверяла. Обидно, что глюк привнесенный - ведь в 2003 все нормально компилировалось. Переписали, блин, компилятор. Прямо как мы - одну ошибку правим, 2 новых добавляем... |
| Автор: azesmcar 20.8.2010, 19:41 | ||||||
Я про эти имелось ввиду т.е. имена, которые содержат двойное подчеркивание или начинаются с подчеркивания и заглавной буквы. У Саттера в More Exceptional C++ была глава посвященная этому, сейчас попробую найти. добавлено По поводу ГЛАВЫ я конечно погорячился, но достаточно красочно описано
http://www.gotw.ca/gotw/085.htm
В 2010-ой тоже самое. |
| Автор: Earnest 23.8.2010, 19:26 |
Да, действительно... но это аргументы шаблона, и их действие неглубоко, и код довольно старый, давно живут. Мне там столько всего править для перехода, что то, что нормально компилируется, трогать не буду. Кстати, мелкософт может захапать под стандартное и без всякого подчеркивания имена - помнится, при переходе 6 -> 2003 сталкивалась, так что не угадаешь. Да и не такая это проблема, по крайней мере, чтобы так эмоционально как Саттер описывать... |