2010-07-07 6 views
9

Я делаю то, что, вероятно, глупо, но было бы неплохо, если бы это сработало.Обмен статическими элементами между экземплярами шаблонов? (невозможно?)

Я пытаюсь специализировать типы таким образом, чтобы мне нужна моя структура поиска, которая по сути является глобальной (но в идеале инкапсулированной как переменная класса), но я хочу, чтобы объекты были безопасными по типу, поэтому они параметризованы.

Следовательно, у меня есть, по сути

template<class T, int N> 
class SpecialArray 
{ 
//... 
private: 
    static map<string, internal_t> lookupTable 
} 

и по какой причине, я не думаю, что до тех пор, пока я пошел, чтобы инициализировать LookupTable , что, когда я говорю

template <class T, int N> 
SpecialArray<T,N>::lookupTable; 

Есть будет много разных lookupTable s работает вокруг прикрепленных к различным экземплярам SpecialArray.

Я подозреваю, что это может быть просто мечта, и правильный ответ просто делает его отдельным глобальным одноэлементным объектом, но есть ли способ сделать его таким, что есть только один lookupTable для всех SpecialArray?

Как в C++, на мой взгляд (который не является реальным C++), это бы что-то вроде

template <class T, int N> 
SpecialArray<*,*>::lookupTable; 

... но, к сожалению GCC не компилировать C++ в моем сознании

Есть ли какой-либо реальный способ получить то, что я хочу (где-то на C++ 0x-land или что-то еще)? Я, вероятно, столкнусь с этой проблемой также с некоторыми статическими методами, которые управляют этой таблицей поиска (которая не отслеживает типы или Ns).

... извините, но это не имеет никакого смысла.

Заранее благодарим за любую помощь или сочувствие, которое вы можете оказать.

+0

Что такое 'internal_t'? –

+1

связанный вопрос: [статический член шаблона C++, один экземпляр для каждого типа шаблона?] (Http://stackoverflow.com/questions/2220975/c-static-template-member-one-instance-for-each-template-type) –

ответ

18

Вы можете добавить не-шаблонный базовый класс и переместить lookupTable в этот класс:

class Base 
{ 
protected: 
    static map<string, internal_t> lookupTable 
}; 

template<class T, int N> 
class SpecialArray : Base 
{ 
    //... 
}; 
+1

Darn - Я писал это, но слишком медленно. Дополнительное примечание: как всегда, объявление 'lookupTable' внутри класса просто таково: декларация. Вам все равно нужно определить экземпляр этого объекта вне определения класса ... –

0

Похоже, вы должны либо просто сделать их глобальными, либо не беспокоиться об этом. Возможно, использование пространств имен - это то, что вы хотите?