首页 文章

使用std :: set实现稀疏3D网格时出错

提问于
浏览
1

我正在尝试使用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 回答

  • 0

    您应该将布尔运算符函数声明为 const 成员:

    inline bool operator < (const Cell& c) const {
                                        // ^^^^^
        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) const { return c._idx == _idx;}
                                         // ^^^^^
    

    否则,这些不能与 Cell 的右值对象一起使用 .

  • 2

    您已将>和==运算符的参数声明为const并且您正在传递临时值 .

    只需在循环中创建一个临时的Object of Cell并将其插入单元格中

    像这样做 :

    for(int k = 0; k < dim; k++)
            for(int j = 0; j < dim; j++)
                for(int i = 0; i < dim; i++)
    {
                 Eigen::Vector3i(i,j,k) eigenVec;
                 Cell  cell(eigenVec);
                 grid.insert(cell);
    }
    

    你的编译应该成功 .

  • 0

    您已在 Cell 中定义 operator < ,但错误表明它想要 bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Cell] . 请注意,您应该使您的成员函数 const .

    你可以为 less 提供一个非成员函数,它可以使用你的成员函数,一旦它是const .

    bool operator <(const Cell &a, const Cell &b)
    {
        return a < b;
    }
    

    但是,如果您的成员函数是 conststd::less 将为您提供此功能 .

相关问题