错误LNK2005:构造函数已定义

时间:2016-06-13 10:33:24

标签: c++ compiler-errors

我在名为UIHandling的头文件中有一个名为UIHandling.h的类。 在课程的顶部,我确保使用:

#ifndef _UIH_
#define _UIH_

当然,文件以#endif

结束

此头文件包含构造函数的所有实现。 我在我的程序中的许多文件中包含了这个类但由于某种原因,我得到以下编译器错误:

1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>CompaniesMap.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Company.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Date.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>GovStock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>main.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) already defined in Bond.obj
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(enum eType)" (??0UIHandling@@QAE@W4eType@@@Z) already defined in Bond.obj
1>Stock.obj : error LNK2005: "public: __thiscall UIHandling::UIHandling(void)" (??0UIHandling@@QAE@XZ) 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.hBond.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)
{
...
}

任何帮助?

1 个答案:

答案 0 :(得分:0)

如果要在类和标题之外定义成员函数,则需要使用inline关键字并确保每个翻译单元只包含一次标题内容(即每个cpp文件,这是完成标题包括警卫或#pragma once)。

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

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

inline;

的cppreference
  

内联函数是具有以下属性的函数:

     
      
  1. 只要每个定义出现在不同的翻译单元中,程序中的内联函数可能有多个定义。例如,可以在多个源文件中#include'd的头文件中定义内联函数。
  2.   
  3. 内联函数的定义必须存在于调用它的翻译单元中(不一定在调用点之前)。
  4.