在C ++中为std :: set定制比较运算符和自定义类

时间:2014-06-26 15:10:12

标签: c++ char set compare stdset

我想创建一个包含我的类对象的集合,我必须确定一个自定义比较。不幸的是,我尝试的一切都没有用。

class My_Class {
    public:
        char letter;
        set<My_Class, compare> Children;
};

Ant然后,比较结构:

struct compare {
    bool operator() (const My_Class& a, const My_Class& b) const{
        return a.letter < b.letter;
    }
};

我怎么能让这项工作好吗?

目前,该问题显示未声明标识符ab

2 个答案:

答案 0 :(得分:1)

您正尝试在compare中使用My_Class结构,该结构在其方法中使用My_Class。这不是一个微不足道的案例,但前瞻性声明将有所帮助。所以这应该有效:

class My_Class;

struct compare {
    bool operator() (const My_Class &a, const My_Class &b) const;
};

class My_Class {
public:
    char letter;
    set<My_Class, compare> Children;
};

bool compare::operator() (const My_Class &a, const My_Class &b) const
{
    return a.letter < b.letter;
}

另一种方法是将比较器传递给std :: set构造函数,而不是将其指定为模板参数:

class My_Class {
public:
    My_Class();
    char letter;
    set<My_Class> Children;
};

struct compare {
    bool operator() (const My_Class& a, const My_Class& b) const{
        return a.letter < b.letter;
    }
};

My_Class::My_Class() : Children( compare() )
{
}

答案 1 :(得分:0)

您的代码存在的问题是无法保证编译。问题不在于compare结构,所以将其从图片中删除。就是这样:

class My_Class {
public:
    char letter;
    set<My_Class, compare> Children;  // it is the set<My_Class> that is the problem
};

在编译器已知My_Class的定义之前,您正在定义std::set My_Class。换句话说,您在std::set容器中使用的是不完整类型。无法保证代码将被编译,即使它已经编译,现在的行为也是未定义的。

如果您想要一个使用不完整类型的容器,可以在此处使用Boost容器类型:
http://www.boost.org/doc/libs/1_55_0/doc/html/container.html

以下是Boost文档中有关不完整类型的说明: http://www.boost.org/doc/libs/1_55_0/doc/html/container/main_features.html#container.main_features.containers_of_incomplete_types