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

function pointer as input parameter for templated class function

本文关键字:类函数 输入 参数 指针 函数      更新时间:2023-10-16

我得到了一段代码,如下所示:

 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 类创建一个对象,我需要在函数指针中传递该对象。我试图用谷歌搜索原因,但没有得到太多。任何人都可以告诉我应该怎么做才能让它工作吗?

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)  {}
   };

您的成员变量未正确声明。它不能像在声明中那样初始化。

试试这个:

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

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

Ordered_list<int> list {less_than_f};

或使用=

Ordered_list<int> list = less_than_f;

(尽管后者仅因为您的构造函数不explicit而起作用)。

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

Collection() : list(less_than_f) {}