使用 std::for_each 并在 std::set 上绑定成员函数,代码无法编译
use std::for_each with bind a member function on a std::set , the code can't be compile
我可以正常编译,当我使用vector:
TEST(function_obj,bindMemeber1){
std::vector<Person> v {234,234,1241,1241,213,124,152,421};
std::for_each(v.begin(),v.end(), std::bind(&Person::print,std::placeholders::_1) );
}
但是当我使用 set 时,出现了错误:
TEST(function_obj,bindMemeber1){
std::set<Person,PersonCriterion> v{234,234,1241,1241,213,124,152,421};
std::for_each(v.begin(),v.end(), std::bind(&Person::print,std::placeholders::_1) );
}
clion's tips
IDE 告诉我一些东西 wrong.when 我强制 IDE 编译,它也编译不成功。
下面是Person的代码;
class Person{
private:
size_t no;
std::string name;
public:
Person():no(0){};
Person(size_t n): no(n){};
Person(const Person& p):no(p.no),name(p.name){};
friend class PersonCriterion;
size_t getNo() const;
void print(){
std::cout<<no<<' ';
}
const std::string &getName() const;
};
class PersonCriterion{
public:
bool operator()(const Person& p1,const Person& p2){
return p1.no<=p2.no;
}
};
size_t Person::getNo() const {
return no;
}
const std::string &Person::getName() const {
return name;
}
从std::set
得到的元素是const-qualified;他们应该是 non-modifiable。您应该将 Person::print
标记为 const
然后它可以在 const
对象上调用。
class Person {
...
void print() const {
// ^^^^^
std::cout<<no<<' ';
}
...
};
顺便说一句:最好也将 PersonCriterion
中的 operator()
标记为 const
。
class PersonCriterion {
public:
bool operator()(const Person& p1, const Person& p2) const {
return p1.no<=p2.no;
}
};
我可以正常编译,当我使用vector:
TEST(function_obj,bindMemeber1){
std::vector<Person> v {234,234,1241,1241,213,124,152,421};
std::for_each(v.begin(),v.end(), std::bind(&Person::print,std::placeholders::_1) );
}
但是当我使用 set 时,出现了错误:
TEST(function_obj,bindMemeber1){
std::set<Person,PersonCriterion> v{234,234,1241,1241,213,124,152,421};
std::for_each(v.begin(),v.end(), std::bind(&Person::print,std::placeholders::_1) );
}
clion's tips IDE 告诉我一些东西 wrong.when 我强制 IDE 编译,它也编译不成功。
下面是Person的代码;
class Person{
private:
size_t no;
std::string name;
public:
Person():no(0){};
Person(size_t n): no(n){};
Person(const Person& p):no(p.no),name(p.name){};
friend class PersonCriterion;
size_t getNo() const;
void print(){
std::cout<<no<<' ';
}
const std::string &getName() const;
};
class PersonCriterion{
public:
bool operator()(const Person& p1,const Person& p2){
return p1.no<=p2.no;
}
};
size_t Person::getNo() const {
return no;
}
const std::string &Person::getName() const {
return name;
}
从std::set
得到的元素是const-qualified;他们应该是 non-modifiable。您应该将 Person::print
标记为 const
然后它可以在 const
对象上调用。
class Person {
...
void print() const {
// ^^^^^
std::cout<<no<<' ';
}
...
};
顺便说一句:最好也将 PersonCriterion
中的 operator()
标记为 const
。
class PersonCriterion {
public:
bool operator()(const Person& p1, const Person& p2) const {
return p1.no<=p2.no;
}
};