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;

上記のコードは機能しません。Compiler は、SimulatedDiskFile::comparator() 関数のメンバーが見つからなかったと言います。この宣言を (構造体の外側に) 使用して関数を配置すると、コンパイラは、型が必要であると言います。

ここに私の疑問があります(1つだけではなく、関連していると思います):

  • 一連のポインターの正しい宣言は何ですか?
  • ポインターを比較する比較関数の正しい宣言はどれですか?

投稿する前に多くの場所を調べましたが、参考文献が紛らわしく、私の特別なケースとはあまり関係がありませんでした (私が思うに、ばかばかしいほど些細なことです - 実際、これが原因かもしれません)。したがって、適切なリンクも非常に役立ちます。

前もって感謝します!

4

2 に答える 2

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;

うまくコンパイルされます。

于 2009-06-16T02:47:16.710 に答える
1

「getFileName()」メソッドがあるべき場所を示していないので、私は手足に出て、コンパレーターでポインターを二重逆参照するつもりはないと仮定します。つまり、次のいずれかを行う必要があります。

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

また:

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

両方ではありません。

于 2009-06-16T02:48:37.830 に答える