1

次のようなコードを取得しました。

 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 クラスのオブジェクトを作成しようとしていました。理由をググってみましたが、よくわかりませんでした。それを機能させるために何をすべきか教えてもらえますか?

4

3 に答える 3

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

ここでは、return を使用して関数を宣言し、名前のない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)  {}
   };
于 2013-01-25T08:09:43.500 に答える
2

クラス メンバーは、ブレース初期化子を使用して宣言でのみ初期化できます。

Ordered_list<int> list {less_than_f};

または使用=

Ordered_list<int> list = less_than_f;

(後者は、コンストラクターが ではないためにのみ機能しますexplicit)。

2011 年より前 (および、執筆時点で利用可能なほとんどのコンパイラ) では、非静的クラス メンバーを宣言で初期化することはまったくできませんでした。コンストラクターが必要でした:

Collection() : list(less_than_f) {}
于 2013-01-25T08:35:46.947 に答える
2

メンバー変数が正しく宣言されていません。宣言にあるため、初期化できません。

これを試して:

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

     Ordered_list<int> list;
 };
于 2013-01-25T08:04:44.330 に答える