Пара проблем.
Ваша самая непосредственная ошибка компилятора вызвана неправильным синтаксисом в реализации функций-членов шаблона класса.Вы должны предварять определение члена шаблона класса ключевым словом template
.То есть:
template<class T> ValueCollection<T>::ValueCollection(void)
{
}
template<class T> int ValueCollection<T>::getValueCount(void)
{
return Values.size();
}
Есть и другая проблема, которая станет очевидной только по мере роста вашей программы.Вы не можете определить шаблонные функции или классы в одном модуле перевода и использовать их в другом месте.Компилятор должен иметь полное определение, доступное в каждой единице перевода.
Как правило, это достигается путем определения функций шаблона непосредственно в заголовочном файле, там, где они объявлены.В вашем случае:
template<class T>
class ValueCollection
{
public:
ValueCollection(void)
{
}
int getValueCount(void)
{
return Values.size();
}
map<string, T> Values;
};
Это только один способ сделать это - есть другие.Другой способ - использовать так называемый « метод включения »:
ValueCollection.h
template<class T>
class ValueCollection
{
public:
ValueCollection(void);
int getValueCount(void);
map<string, T> Values;
};
#include "ValueCollection.hpp:
ValueCollection.hpp
template<class T> ValueCollection<T>::ValueCollection(void)
{
}
template<class T> int ValueCollection<class T>::getValueCount(void)
{
return Values.size();
}
Еще один метод заключается в предоставлении нового определения для каждой единицы перевода, которая хочет использовать шаблоны, но это было бы весьма необычно.(На самом деле, я никогда не делал этого за 15 лет программирования на C ++)