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 - 重载“==”运算符后不需要重载"!=";