2009-06-16 6 views
2

クラスインスタンスへのポインタのSTLセットを宣言する際に問題があります。具体的には、私はこのシナリオを持っています:ポインタのコンテナ

class SimulatedDiskFile { 
    private: 
    // ... 
    public: 
    // ... 
    struct comparator { 
     bool operator() (SimulatedDiskFile* const& file_1, SimulatedDiskFile* const& file_2) { 
     return ((*file_1)->getFileName() < (*file_2)->getFileName()); 
     } 
    }; 
} 

typedef set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet; 

上記のコードは機能しません。コンパイラによると、メンバーSimulatedDiskFile :: comparator()関数が見つかりませんでした。私はこの宣言(構造体の外)で関数を置く場合、コンパイラはそれが型を期待していると言います。

今ここcomの私の疑問(だけではなく1、しかし関連、私は推測する):

  • ポインタのセットのための正しい宣言は何ですか?
  • ポインタを比較する比較関数の正しい宣言は何ですか?

私は投稿前に多くの場所を調べましたが、私は参照が混乱していて、私の特別なケースにはあまり関連していないことを発見しました(私はそれが実際だと思うほど些細なものです。だから、良いリンクも大いに役立ちます!

ありがとうございます!いくつかの不具合を修正

+0

私はg ++でコンパイルします。ただし、ポインタの逆参照と間接参照の両方を使用しているため、比較にエラーがあります。 –

答えて

5

#include <set> 

class SimulatedDiskFile { 
    public: 
    int getFileName() { return 23; } 

    struct comparator { 
     bool operator() (SimulatedDiskFile* file_1, SimulatedDiskFile* file_2) { 
     return (file_1->getFileName() < file_2->getFileName()); 
     } 
    }; 
}; 

typedef std::set<SimulatedDiskFile*, SimulatedDiskFile::comparator> FileSet; 

はうまくコンパイルします。

+0

このように構文を変更しようとしました。それでもまだコンパイルできません。正確なメッセージは 'g ++ -Wall -g -c modules/sources/model.cpp -o obj/model.o modules/sources/model.cpp:56:error:no'です。bool SimulatedDiskFile ::コンパイル(SimulatedDiskFile * const&、SimulatedDiskFile * const&) 'クラス' SimulatedDiskFile 'で宣言されたメンバー関数 –

+0

@Rafael:このサンプルは私にとってもうまくコンパイルされます。実際に特定のエラーを再現するコードのより完全な部分を投稿することは可能でしょうか? – goldPseudo

+0

はい@Rafael、@ goldPseudoのように - 私が(ファイルにコピーして貼り付けた)この正確なスニペット上の正確なコマンドラインは、(いくつかのg ++​​バージョンでも)うれしくコンパイルされます。それをコピー&ペーストして、g ++が壊れていないことを確認してください;-)、最小限の完全な失敗のケースを表示するためにあなたの答えを編集してください! –

1

'getFileName()'メソッドがどこにあるのかを表示していないので、私は手足の外に出て、あなたがポインタをダブルリファレンスすることを意味しないと仮定します。コンパレータ。

return (file_1->getFileName() < file_2->getFileName()); 

か::

return ((*file_1).getFileName() < (*file_2).getFileName()); 

ではなく、両方をつまり、あなたがいずれかを実行する必要があります。

+0

こんにちは! Alexの答えにコメントを読んでください! –

関連する問題