Как правильно наследовать от шаблона обычный класс?
Я создаю классс BaseClass<T>:
template<class T>
class BaseClass
{
public:
BaseClass(void)
{
}
public:
virtual ~BaseClass(void)
{
};
static T GetValueByName(string name)
{
map<string, T>::iterator it = _available.find(name);
if(it!=_available.end())
return (*it).second;
else
return (T)0;
};
}
Далее от него наследую класс с явной инстанциацией:
class Derived : public BaseClass<int>
{
public:
Derived(void)
{
_available.insert(make_pair("Left", 0));
_available.insert(make_pair("Right", 1));
_available.insert(make_pair("Up", 2));
_available.insert(make_pair("Down", 3));
};
public:
virtual ~Derived(void){};
};
И пытаюсь у экземпляра Derived вызвать методы, которые он унаследовал от BaseClass:
Derived* der = new Derived();
cout<<der->GetValueByName("Left")<<endl;
При этом я получаю ошибку линковки LNK2001
error LNK2001: unresolved external symbol "protected: static class std::map<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<struct std::pair<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const ,int> > > BaseClass<int>::_available" (?_available@?$BaseClass@H@@1V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@HU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@@std@@A)
Где и что я сделал не так?