2014-05-08 3 views
1

У меня есть пространство имен 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"); } 

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

ответ

1

Существует два варианта.

  1. Измените функцию, которая будет inline.

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

+0

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

+0

Когда вы используете '#include" файл.h "в файле .cpp, файл cpp скомпилируется со всем, что было включено в него. Когда файл .h содержит полностью определенную функцию, а файлы .h включены в несколько единиц компиляции, функция определяется несколько раз. –

+0

А, ладно, это имеет смысл. Тогда почему бы предшествовать определению заголовка в объявлении шаблона решить проблему? – JordanBell

Смежные вопросы