#include <string>
#include <iostream>
#include <set>
#include <memory>
using std::shared_ptr;
using std::multiset;
using std::string;
using std::cout;
using std::endl;
class MS{
bool compareIsbn(const shared_ptr<string> &lhs,const shared_ptr<string> &rhs)
{
return *lhs < *rhs;
}
multiset<shared_ptr<string>, decltype(compareIsbn)*> item(compareIsbn);
};
int main(){ MS bbb;}
上面这一段代码在g++ 和 vs2015下都无法编译,错误提示为:
error:compareIsbn 不是类型名
调试了几个小时,推测有两个主要的原因:
- 非静态成员函数
compareIsbn
不能作为自定义比较函数 - 静态成员函数无法作为copy constructor参数,如果想使用静态成员函数作为比较函数,需要使用braced Initialization形式。
附修改后的正确代码(只列出修改部分):
static bool compareIsbn(const shared_ptr<string> &lhs,const shared_ptr<string> &rhs)
{
return *lhs < *rhs;
}
multiset<shared_ptr<string>, decltype(compareIsbn)*> item{compareIsbn};