默认 如何递归定义类型?

kingcalf 2006-09-10 08:21:43
标题可能不太准确,问题也傻了点,高人包涵啦
如下:
有这样一段代码:
struct Pair;

typedef vector<Pair> TrieNode;

struct Pair{

char key;

TrieNode *ptr;

Pair(char k, TrieNode *p){ key = k; ptr = p;}

};

如果想用STL的pair应当如何实现呐?
像这样是无法通过编译的:
typedef vector< pair<char, TrieNode*> > TrieNode;

这是一个初学C++的师哥问我,开始没有答上来,想了一下对他说无法实现。因为C++不支持像:
typename TrieNode;
这样的类型声明,所以无法实现typedef的递归定义。自己都觉得这个说法不太能服人啦,早知道不在他面前夸海口说自己擅长C++了^_^
请高人明示!
...全文
263 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingcalf 2006-09-13
  • 打赏
  • 举报
回复
在C++里:
tyedef xxxx Type1

class Type2{
.....
}

Type1和Type2有很大的区别,Type2可以通过声明:
class Type2;
来实现递归定义,而typedef出来的东西却没有为之声明的东西:
class Type1;
typename Type1; //这两个编译器都会报错
所以也无法为之实现递归定义。

有点像呓人说梦-_-!
好啦,结贴^_^

kingcalf 2006-09-13
  • 打赏
  • 举报
回复
在Cpper论坛上一位老兄给的代码,感觉也就只能这样了:

class TrieNodePtr;

typedef std::vector<std::pair<char,TrieNodePtr> > TrieNode;

class TrieNodePtr
{
TrieNode * ptr_;
public:
TrieNodePtr(TrieNode * ptr):ptr_(ptr){}
operator TrieNode *(){return ptr_;}
};

cunsh 2006-09-10
  • 打赏
  • 举报
回复
mark
kingcalf 2006-09-10
  • 打赏
  • 举报
回复
就当我找茬好了,大家有办法吗。研究研究也好啊^_^
kingcalf 2006-09-10
  • 打赏
  • 举报
回复
typedef vector<Pair> TrieNode;
编译器对typedef做语法分析,Pair只要在此行之前有声明,并且在某处有定义就可以了。

我也知道typedef vector< pair<char, TrieNode*> > TrieNode; 是错误的,我是想问有没有一个办法可以办法可以用pair来实现TrieNode这个东西?
或者说,typedef可以递归定义吗?
caoxuecheng 2006-09-10
  • 打赏
  • 举报
回复
后面的好像就不行了:-)
kingcalf 2006-09-10
  • 打赏
  • 举报
回复
#include <vector>
using namespace std;

struct Pair;
typedef vector<Pair> TrieNode; //** 这里不用指针也是可以的
struct Pair{
char key;
TrieNode *ptr;
Pair(char k, TrieNode *p){ key = k; ptr = p;}

};

int main()
{
TrieNode dd;
}
// GCC 3.4.4 编译通过 ^_^
caoxuecheng 2006-09-10
  • 打赏
  • 举报
回复
#include <vector>
using namespace std;

struct Pair;
typedef vector<Pair *> TrieNode;
struct Pair{
char key;
TrieNode *ptr;
Pair(char k, TrieNode *p){ key = k; ptr = p;}

};

int main()
{
TrieNode dd;
}
// visual studio2003 中编译通过

jixingzhong 2006-09-10
  • 打赏
  • 举报
回复
上面提到是可以的,
可以通过一个类型声明 struct Pair;
使得这个类型指针定义合法(但是实例定义还是非法)

但是,
后面的使用 pair 的,
基本就不可能了,
没有办法通知编译器这个自定义的类型 ....
jixingzhong 2006-09-10
  • 打赏
  • 举报
回复
typedef vector< pair<char, TrieNode*> > TrieNode;

象这样的定义方式不可行 ...
TrieNode 类型在前面还不被编译器认识 ...
caoxuecheng 2006-09-10
  • 打赏
  • 举报
回复
你上面定义有问题
struct Pair;

typedef vector<Pair> TrieNode; //这儿有问题,vector这里类型应该已经可以知道内存大小了:-),我觉得阿,你如果改成typedef vector<Pair *> TrieNode;就应该没问题,我试试


struct Pair{

char key;

TrieNode *ptr;

Pair(char k, TrieNode *p){ key = k; ptr = p;}

};
kingcalf 2006-09-10
  • 打赏
  • 举报
回复
to: caoxuecheng
这样做会编译出错,TrieNode是类型,而不是类。^_^
caoxuecheng 2006-09-10
  • 打赏
  • 举报
回复
试试前面加class TrieNode;
因为指针大小都是固定的,应该可以:-)

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧