template<typename Type>
class List
{
public:
List(void);
~List(void);
...
}
который унаследован от
template<typename Type>
class LinkedList : public List<Type>
{
public:
LinkedList(void);
~LinkedList(void);
...
}
но когда я
List<int>* list = new LinkedList<int>();
приходит
error LNK2019: unresolved external symbol "public: __thiscall LinkedList<int>::LinkedList<int>(void)" (??0?$LinkedList@H@@QAE@XZ) referenced in function _wmain
Я знаю, что для шаблона тип определяется при компиляции, я чувствую, что при компиляции следует определить тип typename Type и затем определить тип производного класса во время выполнения. Можно ли использовать полиморфизм с шаблоном таким образом?
/////////////////////////////////////////////// /////////////////////////////////
Спасибо hkaiser и Chubsdad, это проблема линковки.
Я определил конструктор в файле cpp, но компоновщик не может его обнаружить. И я попытался переместить его в заголовочный файл, это сработало, но мне это не нравится.
Кажется, будет нормально, если я определю функции в cpp с разрешенным типом, например:
LinkedList<int>::LinkedList(void)
:List<int>()
{
mHead = new Node<int>(0);
}
вместо:
template<typename Type>
LinkedList<Type>::LinkedList(void)
:List<Type>()
{
mHead = new Node<Type>(0);
}
а какая разница? Почему он становится невидимым при определении шаблона, а видимый при разрешенном? Можно ли определить функции-члены шаблона в cpp?