首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误LNK2005:已经定义的构造函数

错误LNK2005:已经定义的构造函数
EN

Stack Overflow用户
提问于 2016-06-13 10:33:23
回答 1查看 846关注 0票数 3

在名为UIHandling的头文件中有一个名为UIHandling.h的类。在全班的第一名,我确保使用:

代码语言:javascript
复制
#ifndef _UIH_
#define _UIH_

当然,以#endif结束该文件

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

代码语言:javascript
复制
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时,这个错误会显示出来,但我没有。在另一个类似的问题上的答案是,这与反复包含同一个文件有关,这会导致构造函数的许多不同的实现,但使用#ifndef _UIH命令是避免的。

这可能与我如何声明和定义构造函数有关:在UIHandling.h

代码语言:javascript
复制
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)
{
...
}

有什么帮助吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-13 10:36:10

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

代码语言:javascript
复制
class UIHandling : public exception
{
public:
    UIHandling();
    // ...
};

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

inline的偏好;

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

  1. 只要每个定义出现在不同的翻译单元中,程序中可能有多个内联函数的定义。例如,内联函数可以在多个源文件中包含的头文件中定义。
  2. 内联函数的定义必须出现在调用它的翻译单元中(不一定在调用点之前)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37787464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档