класс шаблона, код реализации, вызывающий проблемы со связыванием - PullRequest
0 голосов
/ 14 сентября 2009

В настоящее время у меня есть программа, в которой мой основной код находится в файле main.cpp. Main.cpp включает заголовочный файл "class.h", который объявляет класс, который используется в main.cpp.

Также в main.cpp у меня есть объявления функций, которые объявляют функции, которые я использую в main.cpp. Код для этих функций находится в отдельном файле .cpp fucntions.cpp. Как и main.cpp, functions.cpp также включает class.h, так как тип класса используется внутри функций.

class.h содержит только объявление класса. Код реализации для class.h находится в отдельном файле .cpp classimplementation.cpp.

Все работает нормально, пока я не попытаюсь сделать класс в class.h шаблоном класса. Тогда я получаю проблемы со связыванием. Исследования и тестирование показали, что это потому, что определение функций класса шаблона должно находиться в class.h вместе с объявлением.

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

Я думаю, это потому, что class.h вызывается main.cpp и снова - functions.cpp. Поэтому функции в class.h определяются дважды:

Ошибка 41, ошибка LNK2005: «public: __thiscall RecordPocket :: RecordPocket (int)» (?? 0? $ RecordPocket @ VT @@@@ QAE @ H @ Z) уже определен в classimplementation.obj functions.obj

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

Кто-нибудь был в этом сценарии и может дать любой совет. Я попытался окружить функции, которые я переместил из classimplementation.cpp в class.h, стандартным кодом ifndef CLASSIMP , #define CLASSIMP и PRAGMA ONCE, но ни одна из них не имеет никакого значения.

Если ничего не помогает, я перенесу функции из functions.cpp в main.cpp, чтобы class.h вызывался только один раз, но я бы лучше выяснил, что я делаю неправильно, так как уверен, что так и будет. повториться.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

Вы можете хранить функции шаблона внутри шаблона <> class what {/ HERE /};

template<typename T>
class MyTempClass{
     void myFunctions{
      // code here
     }
 }

РЕДАКТИРОВАНИЕ: Я удалил код, исправленный Гленом

1 голос
/ 14 сентября 2009

Я думаю, что ваша проблема вращается вокруг этих проблем. Как вы подразумевали, любое определение функции шаблона (то есть функция шаблона функции-члена класса шаблона) должно быть полностью выражено в файле .h, потому что, когда компилятор находит конкретный экземпляр шаблона, он должен построить функцию. Вы поняли это и перенесли некоторую реализацию в свой файл class.h. Теперь, если компоновщик найдет MyFunction () более чем в одном модуле, он просто отбрасывает один из них, об ошибке компоновщика не сообщается.

Однако вы не можете определить одну и ту же не шаблонную функцию в двух разных модулях, так как это генерирует ошибку, которую вы получаете выше. Поэтому я подозреваю, что вы также переместили некоторые не шаблонные функции в файл .h; таким образом, включение его в два отдельных файла obj и генерация ошибки компоновщика. Эта теория подтверждается цитируемым сообщением об ошибке, поскольку я отмечаю, что __thiscall RecordPocket :: RecordPocket (int) не является шаблоном.

...