2016-06-13 4 views
1

У меня есть класс под названием UIHandling внутри файла заголовка UIHandling.h. В верхней части класса я удостоверился, чтобы использовать:ошибка LNK2005: конструктор уже задан

#ifndef _UIH_ 
#define _UIH_ 

И конечно закончился файл с #endif

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

1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" ([email protected]@[email protected]@@@Z) already defined in Bond.obj 
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" ([email protected]@[email protected]) already defined in Bond.obj 
1>D:\Asaf\C\VS\hw5\HW5\Debug\HW5.exe : fatal error LNK1169: one or more multiply defined symbols found 

Так что я пошел в Bond.h и Bond.cpp, чтобы увидеть, если есть что-то странное (как в реализации UIHandling::UIHandling() или что-то в этом роде) и нет.

Я видел в другом вопросе, что эта ошибка показывает, когда вы нарушаете ODR, но я этого не делал. In another similar question ответ заключался в том, что это связано с тем, что один и тот же файл снова и снова вызывает множество различных реализаций конструктора, но этого избежать можно с помощью команды #ifndef _UIH.

Это может иметь что-то делать с тем, как я объявляю и определить мои конструкторы: В UIHandling.h:

class UIHandling : public exception 
{ 
public: 
    UIHandling();   // Default C'tor - error unknown 
    UIHandling(eType);  // C'tor with error type 
    template <class T> 
    UIHandling(eType, T); // C'tor with error type and relevant number 
... 
} 
... 
UIHandling::UIHandling() 
{ 
... 
} 

UIHandling::UIHandling(eType e) 
{ 
... 
} 

template <class T> 
UIHandling::UIHandling(eType e, T number) 
{ 
... 
} 

Любая помощь?

+0

«В другом аналогичном вопросе, ответ был, что это имеет какое-то отношение в том числе и тот же файл снова и снова вызывает много различных реализаций конструктора, но избежать с помощью команды #ifndef _UIH.» - Ты очень неправильно читаешь ответы там. Нет, '#ifndef _UIH' не препятствует тому, чтобы один и тот же заголовочный файл включался в несколько исходных файлов, а также не должен. – hvd

+0

Так что же он делает? – PanthersFan92

+0

Он предотвращает включение одного и того же заголовочного файла несколько раз в одном исходном файле. – hvd

ответ

0

Если вы определяете функции-члены вне класса и в заголовке, вам нужно использовать ключевое слово inline и убедитесь, что содержимое заголовка включено только один раз для единицы перевода (т. Е. Для каждого файла cpp, это делается с заголовком включить охранников или #pragma once).

class UIHandling : public exception 
{ 
public: 
    UIHandling(); 
    // ... 
}; 

inline // << add this... 
UIHandling::UIHandling() 
{ 
} 

cppreference for inline;

An inline function is a function with the following properties:

  1. There may be more than one definition of an inline function in the program as long as each definition appears in a different translation unit. For example, an inline function may be defined in a header file that is #include'd in multiple source files.
  2. The definition of an inline function must be present in the translation unit where it is called (not necessarily before the point of call).
+0

Почему? Почему я не могу включить 'UIHandling.h' столько раз, сколько хочу, если у него есть' #pragma once' или '# ifndef' вверху? – PanthersFan92

+0

@ PanthersFan92. Вы можете, акцент делается на содержании. Я отредактирую его, чтобы сделать его более понятным. Включенные охранники гарантируют, что содержимое будет удалено, если оно уже присутствует в TU. – Niall

+0

Но я использовал '# ifndef', так зачем мне использовать' inline'? эти реализации не будут происходить дважды. – PanthersFan92

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