C ++ Полиморфизм с шаблоном класса - PullRequest
1 голос
/ 04 ноября 2010
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?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

Ошибка сгенерирована компоновщиком, поскольку вы не определили конструктор для класса LinkedList.Или он не виден компилятору в точке, где вы используете тип LinkedList<int>, как показано выше.

1 голос
/ 04 ноября 2010

где находится определение конструкторов и деструкторов?Компоновщик жалуется на это.

Это также может быть полезным

0 голосов
/ 13 сентября 2013

Я столкнулся с той же проблемой, разбил заголовочный файл на две части. Первый заголовочный файл объявлял базовый шаблонный класс, второй включал реализацию cpp и затем производные классы. Я предпочитаю иметь еще один заголовочный файл, чем реализацию или реализацию ~ 20 методов для каждого типа.

0 голосов
/ 04 ноября 2010

Ну, это кажется старой проблемой, хитрое определение в cpp может решить это:

template LinkedList<int>::LinkedList(void);

Это компромисс, чтобы избежать определения в файлах .h, но вы должны объявить для каждого используемого типа.Простое решение заключается в определении функции в заголовочных файлах, или, по http://www.parashift.com/c++-faq-lite/templates.html[35.14], есть, казалось бы, противоречивое решение использовать экспорт ключевых слов.Это полезный вопрос: Хранение определений функций шаблона C ++ в файле .CPP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...