3

我有一种情况,我想声明一个类成员函数,它返回一个依赖于类本身的类型。让我给你举个例子:

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

SubstringTree 定义如下:

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

我的问题是,如果我将 SubstringTree 定义放在 Substring 定义之后,静态方法会说它不知道 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)在子字符串之外定义比较器:

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 回答