如何将谓词函数作为模板参数传递



我有一个简单的谓词:

class less_than
{
int  x;
public:
less_than(int i):
x(i)
{
}
bool  operator()(int i) const
{
return i < x;
}
};

我有一个容器,看起来像这样:

my_containers<std::list<int>, less_than, int> myCont(list_1, list_2, less_than(11));
  • 第一个参数说明list_1list_2的类型
  • 第二个参数表示谓词的名称
  • 第三个参数说明list_1list_2的项目类型是什么

我试着创建这样的模板:

template<class Type, class Predicate, class Item_Stored>
class my_containers
{
public:
my_containers(Type &tar_1, Type &tar_2, Predicate felt)
{
ItemList_1 = tar_1;
ItemList_2 = tar_2;
predIcate  = felt;
}
my_containers & insert(const Item_Stored put_in)
{
if (!predIcate.operator()(put_in))
{
ItemList_1.insert(ItemList_1.end(), put_in);
}
else
{
ItemList_2.insert(ItemList_2.end(), put_in);
}
return *this;
}
private:
Type       ItemList_1;
Type       ItemList_2;
Predicate  predIcate;
};

每次我使用.insert(x)时,如果它小于给定的less_than::x,它应该将x添加到第一个列表中,否则会添加到另一个列表中。但它给了我这个错误:

Error   C2512   'less_than': no appropriate default constructor available   

我该怎么修?

您的构造函数需要每个成员的默认构造函数。请改用成员初始值设定项列表

my_containers(Type& tar_1, Type& tar_2, Predicate felt)
:ItemList_1(tar_1), ItemList_2(tar_2), predIcate(felt){}

参考:https://en.cppreference.com/w/cpp/language/constructor.

首先:

  • 尝试将构造函数定义为explicit
  • 则CCD_ 9与CCD_
  • 并始终使用"成员初始化列表":
struct A
{
double m_var;
A(const double var) : m_var(var) {}
};

不是

struct A
{
double m_var;
A(const double var) 
{ 
m_var = var;
}
};

你的问题就会得到解决。因为您的less_than类没有任何默认构造函数,并且在my_container构造函数中,您必须显式初始化predIcate成员,否则,请尝试使用没有默认构造函数的默认构造函数进行初始化,但会在编译中失败。

所以您需要在Member initialize列表中初始化predIcate,或者为less_than类定义一个默认构造函数。

最新更新