如何定义一个全局可见操作符

How to define a global visibly operator

本文关键字:全局 操作符 一个 何定义 定义      更新时间:2023-10-16

我想在我的类上使用binary_search,所以我定义了一个操作符<当一切都在主文件时,它工作,但当我在另一个文件中编写类时,我得到了链接器错误。>

显示这个问题的最简单的例子是B.h:

class B
{
public:
~B(void);
string b;
int v;
B(int val, string bb);
friend bool operator< (const B &lhs, const B &rhs);
 };
 bool operator< (const B &lhs, const B &rhs){
    return lhs.v < rhs.v;
};

b.c p只定义构造函数。主要是这样的:

#include "B.h"
int main( int argc, const char* argv[] )
{
vector<B> vec;
B a1(2, "gg");
B a2(4, "gdhd");
    vec.push_back(a2);
    vec.push_back(a1);
bool pos = binary_search(vec.begin(),vec.end(), B(2, "ghd"));
}

错误LNK2005: "bool __cdecl operator<(类B的const &,类B的const &)"(??M@YA_NABVB@@0@Z)已经在Main.obj中定义LNK1169:找到一个或多个乘法定义的符号

如何修复?

这是因为操作符在头文件中定义不正确。您需要使其为inline(或static)。

如果不是inlinestatic,则该函数将在包含头文件的每个源文件中定义,从而导致多个定义错误。

您在头文件中定义了操作符函数,这意味着每个包含它的.cpp文件都有自己的副本。您有两种可能的解决方案:

  1. 标记功能inline

  2. 将函数移动到。cpp文件

未声明inline的函数必须在最多一个翻译单元中定义。通过让B.cpp和包含main()的文件包含B.h头,可以得到两个定义。相反,如果声明一个函数inline,则需要在使用该函数的每个翻译单元中包含该定义,因此将定义放在头文件中是正确的做法。

因此,如果您希望操作符的实现留在头文件中,则需要在其定义上使用inline限定符—或者直接在class B的定义中定义操作符,并将其声明为友元。后者将使其隐式内联。

否则,您需要将操作符的定义移动到B.cpp文件中