0

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

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;
    }
};

请问我怎样才能使这项工作?

目前,该问题显示该标识符a并且b未声明。

4

2 回答 2

2

您正在尝试在其方法中使用compare结构内部。这不是一个小例子,但前向声明会有所帮助。所以这应该工作:My_ClassMy_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() )
{
}
于 2014-06-26T15:22:35.057 回答
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::setof 。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

于 2014-06-26T16:11:31.067 回答