我有一个情境,我想声明一个类成员函数返回一个依赖于类本身的类型。让我举个例子:
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。
我该怎么办?提前谢谢。
答案 0 :(得分:8)
正如你所写,简短的回答是你不能。
你确实有一些接近的选择:
1)在子串中声明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;
答案 1 :(得分:6)
您可以在课程中定义它:
class Substring {
private:
string the_substring_;
public:
// (...)
typedef set<Substring, Substring::Comparator> SubstringTree;
static SubstringTree getAllSubstring(string main_string, int min_size);
};
答案 2 :(得分:3)
您可以使用此预先声明一个类:
class Foo;
请记住,在实际定义类之前,您只能声明指向它的指针,而不是实例。
答案 3 :(得分:0)
前瞻声明
class Substring;
我不知道这是否适用于Substring的非指针使用。