3

クラス自体に依存する型を返すクラスメンバー関数を宣言したい状況があります。例を挙げましょう:

class Substring {
    private:
        string the_substring_;
    public:
        // (...)
        static SubstringTree getAllSubstring(string main_string, int min_size);
};

SubstringTree は次のように定義されます。

typedef set<Substring, Substring::Comparator> SubstringTree;

私の問題は、Substring 定義の後に SubstringTree 定義を配置すると、静的メソッドが SubstringTree を知らないと言うことです。宣言を逆にすると、typedef は Substring を知らないと言います。

どうすればいいですか?前もって感謝します。

4

4 に答える 4

8

あなたが書いたように、短い答えはあなたができないということです。

いくつかの近い代替手段があります。

1) Substring で SubstringTree を宣言する

class Substring {
public:
    class Comparator;
    typedef set< Substring, Comparator> Tree;

private:
    string the_substring_;
public:
    // (...)
    static Tree getAllSubstring(string main_string, int min_size);
};

typedef Substring::Tree SubstringTree;

2) サブストリングの外側で Comparator を定義します。

class Substring;
class SubstringComparator;
typedef set< Substring, SubstringComparator> SubstringTree;

class Substring {
public:

private:
    string the_substring_;
public:
    // (...)
    static SubstringTree getAllSubstring(string main_string, int min_size);
};

3) テンプレートを使用して、宣言が増えるまでルックアップを遅らせることができます。

template <typename String>
struct TreeHelper
{
  typedef set< String, typename String::Comparator> Tree;
};

class Substring {
public:
  class Comparator;

private:
  string the_substring_;
public:
  // (...)
  static TreeHelper<Substring>::Tree getAllSubstring(string main_string
                                             , int min_size);
};

typedef TreeHelper<Substring>::Tree SubstringTree;
于 2009-07-08T15:33:52.913 に答える
6

クラス内で定義できます。

class Substring {
    private:
        string the_substring_;
    public:
        // (...)
        typedef set<Substring, Substring::Comparator> SubstringTree;
        static SubstringTree getAllSubstring(string main_string, int min_size);
};
于 2009-07-08T15:21:28.960 に答える
3

これでクラスを事前宣言できます:

class Foo;

クラスが実際に定義される前は、インスタンスではなく、クラスへのポインターのみを宣言できることに注意してください。

于 2009-07-08T15:21:36.463 に答える
0

前方宣言

class Substring;

ただし、それが Substring のポインター以外の使用で機能するかどうかはわかりません。

于 2009-07-08T15:22:24.170 に答える