函数指针作为模板化类函数的输入参数

时间:2013-01-25 07:59:37

标签: c++ templates

我得到了一段代码如下:

 template <typename T>
 class Ordered_list{
 public:
     Ordered_list(bool (*less_than_function)(const T&, const T&)): less_than(less_than_function){}

 private:
     bool (*less_than) (const T&, const T&);
 };

 bool less_than_f(const int& i1, const int& i2){
     return i1 < i2;
 }   

 class Collection{
 public:
     Ordered_list<int> list(less_than_f);
 };

代码无法编译,我收到错误:

test.cpp:16: error: 'less_than_f' is not a type

我试图为Ordered_list类创建一个对象,我需要在函数指针中传递它。我试图谷歌的原因,但没有得到太多。 Anybode可以告诉我应该怎样做才能使它工作?

3 个答案:

答案 0 :(得分:3)

class Collection{
  public:
    Ordered_list<int> list(less_than_f);
 };

在这里,您声明一个返回Ordered_list<int>的函数,并采用类型为less_than_f的非参数参数(Opss!no type),而您希望拥有一个成员“list”。你需要在构造函数的初始化列表中初始化它(因为Ordered_list没有默认的构造函数)[嗯..不确定要初始化的C ++ 11新选项,但现在不在VC2012中]。

 class Collection{
  public:
    Ordered_list<int> list;
    Collection (): list(less_than_f){} 
    explicit Collection (   bool (*less_than_function)(const int& i1, const int& i2)   )
       : list(less_than_function)  {}
   };

答案 1 :(得分:2)

您的成员变量未正确声明。它无法在声明中进行初始化。

试试这个:

 class Collection
 {
 public:
     Collection() : list(less_than_f) {}

     Ordered_list<int> list;
 };

答案 2 :(得分:2)

类成员只能使用大括号初始化器在其声明中初始化:

Ordered_list<int> list {less_than_f};

或使用=

Ordered_list<int> list = less_than_f;

(虽然后者只能起作用,因为你的构造函数不是explicit)。

在2011年之前(并且在撰写本文时,在大多数可用的编译器中),非静态类成员根本无法在其声明中初始化;需要一个构造函数:

Collection() : list(less_than_f) {}