проблема с линковкой при наследовании от шаблона обычного
От: flashnik  
Дата: 03.01.07 22:25
Оценка:
Как правильно наследовать от шаблона обычный класс?
Я создаю классс 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)


Где и что я сделал не так?
Re: Тестовый проект
От: flashnik  
Дата: 03.01.07 22:32
Оценка:
Проект в 2005 студии залит сюда
Re: проблема с линковкой при наследовании от шаблона обычног
От: Анатолий Широков СССР  
Дата: 03.01.07 22:48
Оценка:
Добавьте после определения шаблона BaseClass определение _available:

template<class T>
std::map<std::string, T> BaseClass<T>::_available;


А то, объявить-то вы объявили _available, а вот определить — не определили.
Re[2]: проблема с линковкой при наследовании от шаблона обыч
От: flashnik  
Дата: 03.01.07 23:00
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Добавьте после определения шаблона BaseClass определение _available:


АШ>
АШ>template<class T>
АШ>std::map<std::string, T> BaseClass<T>::_available;
АШ>


АШ>А то, объявить-то вы объявили _available, а вот определить — не определили.



Громадное спасибо за ответ! Все заработало
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.