我正在尝试使用std :: set容器实现稀疏的3D网格,但我无法理解从编译器返回的错误,这是我正在尝试运行的最小示例:
#include <iostream>
#include <vector>
#include <limits>
#include <set>
#include <Eigen/Core>
using namespace std;
class Cell {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
Cell(const Eigen::Vector3i idx=Eigen::Vector3i::Zero()):_idx(idx) {
_center = Eigen::Vector3f::Zero();
_parent = 0;
_distance = std::numeric_limits<int>::max();
}
inline bool operator < (const Cell& c){
for (int i=0; i<3; i++){
if (_idx[i]<c._idx[i])
return true;
if (_idx[i]>c._idx[i])
return false;
}
return false;
}
inline bool operator == (const Cell& c) { return c._idx == _idx;}
private:
Eigen::Vector3i _idx;
Eigen::Vector3f _center;
vector<Eigen::Vector3f> _points;
Cell* _parent;
size_t _closest_point;
float _distance;
int _tag;
};
int main(int argc, char* argv[]) {
set<Cell> grid;
float max = 1, min = -1;
int dim = 5;
float delta = (max-min)/(dim-1);
for(int k = 0; k < dim; k++)
for(int j = 0; j < dim; j++)
for(int i = 0; i < dim; i++)
grid.insert(Cell(Eigen::Vector3i(i,j,k)));
return 0;
}
这是编译器错误:
在/ usr / include / c /4.8/string:48:0中包含的文件中,来自/ usr / include / c /4.8/bits/locale_classes.h:40,来自/ usr / include / c /4.8/bits/ ios_base.h:41,来自/ usr / include / c /4.8/ios:42,来自/ usr / include / c /4.8/ostream:38,来自/ usr / include / c /4.8/iostream:39,来自/ home / dede / build / sparse_grid / main.cpp:1:/ usr / include / c /4.8/bits/stl_function.h:实例化'bool std :: less <_Tp> :: operator()(const _Tp&, const _Tp&)const [with _Tp = Cell]':/ usr / include / c /4.8/bits/stl_tree.h:1324:11:从'std :: pair std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare中需要,_Alloc> :: _ M_get_insert_unique_pos(const key_type&)[with _Key = Cell; _Val = Cell; _KeyOfValue = std :: _ Identity; _Compare = std :: less; _Alloc = std :: allocator; std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare,_Alloc> :: key_type = Cell]'/ usr / include / c /4.8/bits/stl_tree.h:1377:47:需要'std :: pair,bool > std :: _ Rb_tree <_Key,_Val,_KeyOfValue,_Compare,_Alloc> :: _ M_insert_unique(_Arg &&)[with _Arg = Cell; _Key =细胞; _Val = Cell; _KeyOfValue = std :: _ Identity; _Compare = std :: less; _Alloc = std :: allocator]'/ usr / include / c /4.8/bits/stl_set.h:472:40:需要'std :: pair,_Compare,typename _Alloc :: rebind <_Key> :: other>: :const_iterator,bool> std :: set <_Key,_Compare,_Alloc> :: insert(std :: set <_Key,_Compare,_Alloc> :: value_type &&)[with _Key = Cell; _Compare = std :: less; _Alloc = std :: allocator; typename std :: _ Rb_tree <_Key,_Key,std :: _ Identity <Key>, Compare,typename _Alloc :: rebind <_Key> :: other> :: const_iterator = std :: _ Rb_tree_const_iterator; std :: set <_Key,_Compare,_Alloc> :: value_type = Cell]'/ home /dede/build/sparse_grid/main.cpp:53:57:从这里需要/ usr / include / c /4.8/bits/stl_function .h:235:20:错误:将'const Cell'作为'bo'的'this'参数传递给'bool Cell :: operator <(const Cell&)'丢弃限定符[-fpermissive] {return __x <__y; } ^ make [2]:* [CMakeFiles / sparse_grid.dir / main.cpp.o]错误1 make [1]:* [CMakeFiles / sparse_grid.dir / all]错误2 make:*** [all]错误2
如果有人能告诉我我做错了什么,我真的很感激 .
谢谢,费德里科
3 回答
您应该将布尔运算符函数声明为
const
成员:否则,这些不能与
Cell
的右值对象一起使用 .您已将>和==运算符的参数声明为const并且您正在传递临时值 .
只需在循环中创建一个临时的Object of Cell并将其插入单元格中
像这样做 :
你的编译应该成功 .
您已在
Cell
中定义operator <
,但错误表明它想要bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Cell]
. 请注意,您应该使您的成员函数const
.你可以为
less
提供一个非成员函数,它可以使用你的成员函数,一旦它是const .但是,如果您的成员函数是
const
,std::less
将为您提供此功能 .