鱼C论坛

 找回密码
 立即注册
查看: 3932|回复: 1

关于C++模板和内嵌类的问题,求助甲鱼和各位鱼油

[复制链接]
发表于 2013-2-19 16:28:13 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 灬愤怒DE尐鸟灬 于 2013-2-19 16:54 编辑

template<typename T>
class BSTree{
public:
    BSTree():root(NULL){};
    BSTree &operator=(const BSTree &);
    ~BSTree();
     。。。
private:
    struct Node{ //内嵌类
        T data;
        Node *lchild;
        Node *rchild;
    };

    Node *root;
        //Node *作为返回值时成员函数在类外定义出错,直接在类内定义则没问题
    Node *max(Node *tree) const;  
    Node *min(Node *tree) const;
    Node *clone(Node *tree) const;
};

//类外定义提示: 错误:expected constructor, destructor, or type conversion before ‘*’ token
template<typename T>
Node *BSTree<T>::max(Node *tree) const{
    if(NULL == tree)
        return NULL;
    if(NULL == tree->lchild)
        return tree;
    return max(tree->lchild);
}

定义如上所示的外部类和内嵌类,然后以Node *在类外定义max、min、clone方法时提示下面的错误:
错误:expected constructor, destructor, or type conversion before ‘*’ token
如果在类内直接定义这三个方法则无错误,请问此处以Node *作为返回值在外部定义成员函数
为什么会出错,改成BSTree<T>::Node *也是错的。而在类内则没有问题。


最佳答案

查看完整内容

修改后代码: (vs2010上编译通过) 关键点在于 typename BSTree::Node* BSTree::max(Node *tree) const{ 这一句,函数的返回值是你的类成员,你却没有指明作用域,所以编译器就没有办法找到。关于前面的typename,是指明这个是个类型。 参考资料: http://hi.baidu.com/thenow/item/0a3aa3ac72a05ff714329b15
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-19 16:28:14 | 显示全部楼层
修改后代码: (vs2010上编译通过)
  1. template<typename T>
  2. class BSTree{
  3. public:
  4.         BSTree():root(NULL){};
  5.         BSTree &operator=(const BSTree &);
  6.         ~BSTree();
  7.        
  8. private:       
  9.         struct Node{ //内嵌类
  10.                 T data;
  11.                 Node *lchild;
  12.                 Node *rchild;
  13.         };
  14.         Node *root;
  15.         //Node *作为返回值时成员函数在类外定义出错,直接在类内定义则没问题
  16.         Node *max(Node *tree) const;  
  17.         Node *min(Node *tree) const;
  18.         Node *clone(Node *tree) const;
  19. };

  20. //类外定义提示: 错误:expected constructor, destructor, or type conversion before ‘*’ token
  21. template<typename T>
  22. typename BSTree<T>::Node* BSTree<T>::max(Node *tree) const{
  23.        

  24.         if(NULL == tree)
  25.                 return NULL;
  26.         if(NULL == tree->lchild)
  27.                 return tree;
  28.         return max(tree->lchild);

  29. }

  30. int main()
  31. {
  32.         return 0;
  33. }
复制代码
关键点在于 typename BSTree<T>::Node* BSTree<T>::max(Node *tree) const{   这一句,函数的返回值是你的类成员,你却没有指明作用域,所以编译器就没有办法找到。关于前面的typename,是指明这个是个类型。
参考资料:
http://hi.baidu.com/thenow/item/0a3aa3ac72a05ff714329b15

点评

~~~~~~+1~~~~~~~  发表于 2013-2-19 21:20
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-8 04:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表