| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > инициализация статических данных |
| Автор: zss 3.7.2006, 09:18 | ||||||||||
есть шаблонный класс
я хочу наследоваться от него и просто инициализировать map_; например *.h
и тогда *.cpp
но 1. Говорит, что нельзя инициализировать статические члены через производный класс 2. каждый шаблон будет инстанцирован со своим статическим map_? например
3.и как будет дело обстоять с однотипными шаблонами (тоесть инстанцированные одним типом) например
|
| Автор: slava72 3.7.2006, 11:07 |
| т.к. map_ принадлежит Parser<ENUM> то и инициализировать нужно Parser<ENUM>::map_ соответствено, все классы порожденные от Parser<ENUM> будут разделять 1 и тот же map_, а Parser<ENUM1>::map_ и Parser<ENUM2>::map_ - различны |
| Автор: slava72 3.7.2006, 12:04 | ||
а так ?
вообще то для подобных конструкций предпочитаю пользоватся typedef-ом )) |
| Автор: zss 3.7.2006, 12:19 | ||||
тоже самое
Map и есть typedef
|
| Автор: slava72 3.7.2006, 12:50 | ||||
Выдержка из draft-a:
Не до конца понятно, но похоже инитить чем хочешь не получится. Обмануть можно чем то вроде:
Что-то типа этого, но не уверен что прокатит (( либо (для сокрытия деталей) в классе Some1 объявляем статическую функцию, возвращающюю map (можно приватню - тогда объявляем InitMap другом), в специализации InitOfMap - вызываем эту статическую функцию. Реализация функции в .cpp |
| Автор: slava72 3.7.2006, 13:14 | ||
| Еще 1-н вариант (не знаю насколько удобный/удачный) в этой задаче - шаблонс с 2-мя параметрами, при этом 2-й - указатель на функцию. Хотя не совсем ясен прототип этой функции. Компилера под рукой нет, но что-то подобное:
|
| Автор: zss 3.7.2006, 14:42 | ||
slava72, вот так компилится
но я не совсем уверен, что это правильно и еще не линкуется - говорит, что не видно ToString и ToValue |
| Автор: slava72 3.7.2006, 15:06 | ||
| Если компиоится, то все нормально, по идее номальная специализация. А ToString и ToValue похоже надо писать самому - это преобразование класса <T> в стороку и обратно. В .cpp:
|
| Автор: zss 3.7.2006, 15:10 | ||
тогда пропадает весь смысл шаблонного наследования |
| Автор: slava72 3.7.2006, 15:37 | ||
Если шаблонные функции вызываются, значит их кто-то должен написать ? Можно наложить ограничения на шаблонный параметр, например считать T - классом, имеющим конструктор от строки и преобразование в строку. Или дружественные функции string ToString(const T&) или еще что нибудь. Для этих типов пишешь обобщенную реализацию функций. А для всех не удовлетворяющих - специализированные функции. Опять таки вопрос - кто автор класса Parser - если ты сам, то нужно более детально продумать что и как ты хочешь сделать. А если кто-то другой, то есть что дают ... |
| Автор: zss 3.7.2006, 15:44 | ||
все оказалось проще - у меня реализация была описана в *.cpp - перенес в *.h и все сварилось спасибо за помощь |