c++ - error C2678: no operator found which takes a left-hand operand of type 'const _Ty'
问题描述
I get the error:
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29910\include\xstddef(127,1): error C2678: binary '<': no operator found which takes a left-hand operand of type 'const _Ty' (or there is no acceptable conversion)
when i run my code:
#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;
}
}
I'm using Visual Studio Community 2019. I've tried adding dummy '<' operators to the class and haven't found any other threads that worked for me.
解决方案
std::map
默认情况下std::less
用于比较,默认情况下使用operator <
. 所以你实现那个操作符是正确的。
但是,该错误表明没有operator <
左手边const
。你需要一个 const 版本:
class grid {
// ...
bool operator < (const grid &o) const { // Note *const* at end
// Do something meaningful here
}
}
阅读关于 const-correctness 的信息(例如这里)。
另请注意,运算符 < 需要提供严格的弱排序,因此如果a < b == true
,它必须是b < a == false
推荐阅读
- angular - 将多部分/表单数据从 Angular 前端发送到 .NetCore 后端
- javascript - Vanilla javascript图像轮播在首次加载时未初始化
- android - 如果 BroadcastReceiver 在 AppWidgetProvider 中注册,它会保持活动多长时间?
- reactjs - 如何根据 React 上的输入表单禁用/启用按钮?
- typescript - 如何检查一个javascript对象数组的属性是否包含在一个对象数组中?
- sql-server - 创建引用复合键的外键
- javascript - 使用 Three.js 无法在 Mapbox 上加载 3D 模型
- python - 在没有循环的特定索引中创建张量
- python - Websocket 传输不可用。烧瓶
- ios - SwiftUI - 如何覆盖嵌套的偏移/位置动画?