我想创建一个包含我的类对象的集合,我必须确定一个自定义比较。不幸的是,我尝试的一切都没有用。
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
。
答案 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