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 ответ

Решение

Есть два варианта.

  1. Измените функцию на inline,

    inline void hey() { printf("Hey"); }
    
  2. Объявите функцию в заголовочном файле, но не определяйте ее. Определите его в файле.cc.

Другие вопросы по тегам