如何定义一个全局可见操作符
How to define a global visibly operator
我想在我的类上使用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
)。
如果不是inline
或static
,则该函数将在包含头文件的每个源文件中定义,从而导致多个定义错误。
您在头文件中定义了操作符函数,这意味着每个包含它的.cpp文件都有自己的副本。您有两种可能的解决方案:
-
标记功能
inline
-
将函数移动到。cpp文件
未声明inline
的函数必须在最多一个翻译单元中定义。通过让B.cpp
和包含main()
的文件包含B.h
头,可以得到两个定义。相反,如果声明一个函数inline
,则需要在使用该函数的每个翻译单元中包含该定义,因此将定义放在头文件中是正确的做法。
inline
限定符—或者直接在class B
的定义中定义操作符,并将其声明为友元。后者将使其隐式内联。
否则,您需要将操作符的定义移动到B.cpp
文件中
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 当vector是tje全局变量时,c++中vector的内存管理
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何创建一个空的全局类并在启动时实例化它
- 内联函数中具有内部链接的全局变量
- 为什么虚函数不能是静态的和全局的?
- 如何在信号处理程序和普通函数中对全局变量进行互斥读写操作
- 全局作用域中函数指针的赋值
- g++用户定义的动态链接库上的全局new和delete运算符
- 在命名空间中使用全局命名空间中的函数
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 如何重载全局new操作符
- 如何定义一个全局可见操作符
- 全局操作符和多态性
- 在全局范围内重载std容器上的操作符是不好的风格吗?
- 将std::cout添加到全局操作符新掩码SIGSEGV中
- 你能在.hpp文件中重载一个全局操作符吗?
- 命名空间作用域中的操作符在全局作用域中隐藏另一个操作符
- CUDA C编译错误:全局函数中不允许使用new操作符