Ошибка компоновки в C ++ - реализация indexList - PullRequest
0 голосов
/ 07 апреля 2009
Linking... 
Directory.obj : error LNK2019: unresolved external symbol "public: void __thiscall indexList<class entry,100>::read(class std::basic_istream<char,struct std::char_traits<char> > &)" (?read@?$indexList@Ventry@@$0GE@@@QAEXAAV?$basic_istream@DU?$char_traits@D@std@@@std@@@Z) referenced in function _main

Получение этой ошибки и других, связанных с реализацией indexList. Я включил все нужные файлы, не уверен, что это значит?

indexList.h
indexList.cpp

Кроме того, используя VS .NET 2003 - они находятся в «Исходных файлах» и «Заголовочных файлах». Однако я проверил удаление indexLish.h, и ошибка не изменилась?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2009

У вас есть шаблон класса. Это означает, что когда компилятору нужно вызвать функцию, он будет смотреть на определение вашего шаблона и генерировать соответствующий код по мере необходимости.

Например, следующее , вероятно, содержит ошибку времени компиляции, если попытаться вызвать ее:

template <typename T>
void doSomething(const T& x) {
    x->_this_function_does_not_exist_ever_();
}

Но если вы не позвоните doSomething, вы не получите ошибок.

Проблема, с которой вы столкнулись, заключается в том, что ваш заголовочный файл сообщает компилятору: «Эй, эти функции существуют», но когда компилятор пытается их сгенерировать, он не может найти никаких определений. (Вы не можете «скомпилировать» определения в исходном файле и связать их, они должны быть видны вызывающей стороне.)

Наиболее распространенным решением является простое определение всего шаблона класса в файле .h или .hpp.

1 голос
/ 07 апреля 2009

Поскольку вы используете шаблонов , лучшим способом является включение определения в файл .H.

Я прочитал кое-что из этой книги . А вот что-то это тоже может вам помочь.

1 голос
/ 07 апреля 2009

Используете ли вы Visual Studio, включите оба файла в решение и затем запустите.

...