错误 C2678:未找到采用类型为 'const _Ty' 的左侧操作数的运算符

error C2678: no operator found which takes a left-hand operand of type 'const _Ty'

本文关键字:C2678 Ty 运算符 操作数 const 类型 错误      更新时间:2024-09-30

我得到错误:

1>C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29910includexstddef(127,1): error C2678: binary '<': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion)当我运行代码时:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <string>
#include <iomanip>
#include <map>
#include <bitset>
#include <cstring>
#include <queue>
#include <math.h>
using namespace std;
class grid {
private:
public:
vector<vector<short> > tiles;
grid()
{
tiles.resize(4);
for (int i = 0; i < 4; i++)
tiles[i].resize(4);
}
inline bool operator==(grid& b)
{
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (tiles[i][j] != b.tiles[i][j])
return false;
return true;
}
inline bool operator<(const grid& b)
{
return false;
}
void shiftUp()
{
for (int k = 0; k < 4; k++)
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (tiles[j][i] == 0)
swap(tiles[j][i], tiles[j + 1][i]);
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
if (tiles[j][i] == tiles[j + 1][i])
{
tiles[j][i] *= 2, tiles[j + 1][i] = 0;
break;
}
}
}
for (int k = 0; k < 4; k++)
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (tiles[j][i] == 0)
swap(tiles[j][i], tiles[j + 1][i]);
}
};
map<grid, bool> used;
bool exists(grid x)
{
return used[x];
}
int main()
{
grid x;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
cin >> x.tiles[i][j];
x.shiftUp();
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
cout << x.tiles[i][j] << " ";
cout << endl;
}
}

我正在使用Visual Studio社区2019。我已尝试添加dummy'<'运算符添加到类中,但没有找到任何其他适用于我的线程。

std::map默认使用std::less进行比较,默认使用operator <。因此,实现该运算符是正确的。

然而,该错误表明没有operator <const左手侧。你需要一个常量版本:

class grid {
// ...
bool operator < (const grid &o) const { // Note *const* at end
// Do something meaningful here
}
}

阅读有关常量正确性的信息(例如,此处(。

还要注意,运算符<需要提供严格的弱排序,所以如果是a < b == true,则必须是b < a == false

相关文章: