У меня есть пространство имен C++, называемое ShapeBuilder, содержащее набор функций шаблона, который помогает рисовать различные формы плиток в игре на основе плитки (квадрат, линия и т. Д.). не Каждая функция в этом пространстве имен используются шаблоны без ошибок, пока я пытался писать функцию нешаблонном - что-то простое, какLNK2005, вызванный функциями без шаблона
void hey() { printf("Hey"); }
Какие вызываются следующие ошибки:
1>HouseGenerator.obj : error LNK2005: "void __cdecl ShapeBuilder::hey(void)" ([email protected]@@YAXXZ) already defined in Game.obj
1>WorldBuilder.obj : error LNK2005: "void __cdecl ShapeBuilder::hey(void)" ([email protected]@@YAXXZ) already defined in Game.obj
- WorldBuilder использует пространство имен ShapeBuilder (и, очевидно, включает ShapeBuilder.h).
- HouseGenerator является другим классом WorldBuilder, и включает в себя WorldBuilder.h
- Всего ShapeBuilder код написан в ShapeBuilder.h, который включает в себя WorldBuilder.h
- Я действительно использовал #pragma один раз, во всех соответствующем классов, чтобы предотвратить Рекурсивное включение.
Замена верхнего кода на следующее приведет к удалению ошибки.
template <class T>
void hey() { printf("Hey"); }
Технически я мог бы просто поместить объявление шаблона перед всеми функциями, но я уверен, что я бы гореть в аду за это. Любая идея, что происходит?
Это действительно работает, но когда дело доходит до него, я не хочу, чтобы функции были встроенными, когда они начинают становиться большими. Возможно, определение его в .cpp будет работать, но оно убивает меня, почему это происходит. – JordanBell
Когда вы используете '#include" файл.h "в файле .cpp, файл cpp скомпилируется со всем, что было включено в него. Когда файл .h содержит полностью определенную функцию, а файлы .h включены в несколько единиц компиляции, функция определяется несколько раз. –
А, ладно, это имеет смысл. Тогда почему бы предшествовать определению заголовка в объявлении шаблона решить проблему? – JordanBell