LNK2005 вызывается исключительно не шаблонными функциями
У меня есть пространство имен C++ под названием ShapeBuilder, содержащее набор шаблонных функций, которые помогают рисовать различные формы плиток в игре на основе плиток (квадрат, линия и т. Д.). Каждая функция в этом пространстве имен безошибочно использовала шаблоны до тех пор, пока я не попытался написать функцию, не являющуюся шаблоном.
void hey() { printf("Hey"); }
Что вызвало следующие ошибки:
1>HouseGenerator.obj : error LNK2005: "void __cdecl ShapeBuilder::hey(void)" (?hey@ShapeBuilder@@YAXXZ) already defined in Game.obj
1>WorldBuilder.obj : error LNK2005: "void __cdecl ShapeBuilder::hey(void)" (?hey@ShapeBuilder@@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"); }
Технически, я мог бы просто поместить объявление шаблона перед всеми функциями, но я почти уверен, что сгорю за это. Есть идеи, что происходит?
1 ответ
Решение
Есть два варианта.
Измените функцию на
inline
,inline void hey() { printf("Hey"); }
Объявите функцию в заголовочном файле, но не определяйте ее. Определите его в файле.cc.