Шаблонное свойство C ++ в заголовке класса с использованием std :: map - Ошибка компилятора C1001

Я новичок в C ++, поэтому не уверен, что делаю не так.

Это моя конструкция:

Struct

template<size_t N> struct Offsets 
{ 
    static const int length = N;
    DWORD offsets[N]; 
};

И свойство:

template <size_t N>
std::map<std::string, std::map<DWORD, Offsets<N>>> pointers;

Это приводит к

Ошибка компилятора C1001.

Что в этом плохого?


person Dude    schedule 20.05.2013    source источник


Ответы (2)


Переменные нельзя создавать по шаблону, они должны быть полностью указаны. Итак, чтобы объявить вашу переменную pointers, вы должны указать N.

person Some programmer dude    schedule 20.05.2013
comment
Звучит разумно. Спасибо за твой ответ. Вы бы сказали, что использование std :: vector было бы лучшей альтернативой? - person Dude; 20.05.2013
comment
@ user2081200 Я действительно не могу сказать, что было бы лучше, поскольку я действительно не знаю, чего вы хотите достичь. - person Some programmer dude; 20.05.2013
comment
Просто трехмерное отображение. вот так: 1. Метка, 2. Адрес, 3. Смещения. Смещения бывают разных размеров, они различаются. - person Dude; 20.05.2013
comment
@ user2081200 Шаблоны должны быть полностью оценены при компиляции, и, похоже, вы хотите, чтобы у вас была возможность иметь разные размеры, которые устанавливаются во время выполнения. Так что да, тогда std::vector кажется лучшим решением. - person Some programmer dude; 20.05.2013
comment
@ user2081200 Похоже, вы просто хотите, чтобы typedefs шаблона / псевдонима использовал произвольный экземпляр шаблона struct Offsets с шаблоном std::map. Этот тип typedef уже указан, но еще не везде поддерживается: stackoverflow.com/q/26151/1175253 (обходной путь был только что опубликован DaBrain) - person Sam; 20.05.2013

Вы не можете использовать шаблон для переменной. Если вы хотите, чтобы указатели оставались гибкими, инкапсулируйте их в класс или структуру шаблона.

template< size_t N >
class PointerOffsetMap
{
...
public:
    std::map<std::string, std::map<DWORD, Offsets<N>>> pointers;
}

просто очень простой пример, вам, вероятно, следует сделать указатели частными и добавить некоторые функции доступа, чтобы получить приятный интерфейс.

person DaBrain    schedule 20.05.2013
comment
Спасибо за красивую идею :). - person Dude; 20.05.2013