vs错误C2672&C2893,C2678,LNK2005

vs错误C2672&C2893,C2678,LNK2005

C2672&C2893

C2893 未能使函数模板"unknown-type std::equal_to::operator ()(_Ty1 &&,_Ty2 &&) const"专用化

C2672 “operator __surrogate_func"未找到匹配的重载函数”

原因:调用 std::find() 没有重载==运算符

C2678

C2678 二进制"!=":没有找到接受"const T"类型的左操作数的运算符(或没有可接受的转换)

错误的重载方式:
写在类外部

struct T;
bool operator==(const T &t1,const T &t2);

且重载vector<T>的==运算符;

template<class T>
bool operator==(const vector<T> &v1,const vector<T> &v2)
{
	if(v1.size()!=v2.size())return false;
	for(size_t i=0;i<v1.size();++i)
	{
		if(v1[i]!=v2[i])return false;
	}
	return true;
}

一开始以为是只重载了"==“没有重载”!="的原因,后面解释原因和解决方法;

LNK2005

LNK2005 “bool __cdecl operator==(struct T const &,struct T const &)”(??8@NAEBUT@@0@Z)已经在T.obj中定义;

LNK1169 找到一个或多个多重定义的符号

因为"=="运算符写在类外部;

正确的==重载方式

struct T
{
	//成员变量
public:
	bool operator==(const T &t2)const
	{
		//定义
	}
}

小结

  • 调用std::find需要重载"=="运算符;
  • 一定要是public属性;
  • 形参可以不带const和&,但形参列表的圆括号后一定要const
  • vector<T>是不需要重载的,因为stl已经重载过了,方式是先比size再比内存,比一个一个元素比较的方法高明多了;
    Microsoft Visual Studio 14.0(即vs2015)中vector的==运算符行数:1808
  • 重载“==”运算符后不需要重载"!=";
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值