为二叉树创建tNode类

时间:2017-04-28 21:24:40

标签: c++ class binary-tree

我为二叉树的tNode class提供了以下定义:

#ifndef TNODE_H
#define TNODE_H

template <typename T>
class tNode<T>{
public:
    T nodeValue;
    tNode<T> *left, *right, *parent;

    tNode<T>(const& T value, tNode<T> l = NULL, tNode<T> r = NULL, tNode<T> p){
        nodeValue = value;
        left = l;
        right = r;
        parent = p;
    }
};

#endif

编译main.cpp时,我遇到以下错误(主要内容没有任何内容):

tNode.h:5:7: error: ‘tNode’ is not a class template
 class tNode<T>{
       ^~~~~
tNode.h:10:18: error: ISO C++ forbids declaration of ‘T’ with no type [-fpermissive]
  tNode<T>(const& T value, tNode<T> *l = NULL, tNode<T> *r = NULL, tNode<T>    *p){
                  ^
tNode.h:10:18: error: declaration of ‘const int& T’ shadows template parameter
tNode.h:4:11: note: template parameter ‘T’ declared here
 template <typename T>
           ^~~~~~~~
tNode.h:10:20: error: expected ‘,’ or ‘...’ before ‘value’
  tNode<T>(const& T value, tNode<T> *l = NULL, tNode<T> *r = NULL, tNode<T> *p){
                    ^~~~~
tNode.h: In constructor ‘tNode<T>::tNode(const int&)’:
tNode.h:10:18: error: declaration of ‘const int& T’ shadows template parameter
  tNode<T>(const& T value, tNode<T> *l = NULL, tNode<T> *r = NULL, tNode<T> *p){
                  ^
tNode.h:4:11: note: template parameter ‘T’ declared here
 template <typename T>
           ^~~~~~~~
tNode.h:11:15: error: ‘value’ was not declared in this scope
   nodeValue = value;
               ^~~~~
tNode.h:12:10: error: ‘l’ was not declared in this scope
   left = l;
          ^
tNode.h:13:11: error: ‘r’ was not declared in this scope
   right = r;
           ^
tNode.h:14:12: error: ‘p’ was not declared in this scope
   parent = p;
            ^

非常感谢能够对这些错误提供一些见解的任何帮助。感谢。

2 个答案:

答案 0 :(得分:0)

创建类模板的语法错误,应该是这样的......

template <class type> class class_name {
   .
   .
   .
}

此处,type是占位符类型名称,将在实例化类时指定。

还有构造函数的定义

tNode<T>(const& T value, tNode<T> l = NULL, tNode<T> r = NULL, tNode<T> p)

不遵守默认参数的规则。

  

在函数声明中,一旦将默认值用于参数,   所有后续参数都必须具有默认值。

答案 1 :(得分:0)

提供的代码在语法和语义上都是不正确的。 从语法上讲,类模板遵循语法template <class A_Type> class class_name;请注意,泛型类型A_Type未使用类名称声明(就像稍后实例化模板时那样),而是在template < class ... - 部分之后。 其次,它将tNode *left指定为此类的指针,而构造函数tNode(const T &value, tNode l = NULL, ...)不使用指针(也不是引用)。这将在以后实例化模板时导致编译器错误。

模板应至少看起来像这样:

template <class T>
class tNode{
public:
    T nodeValue;
    tNode *left, *right, *parent;

    tNode(const T &value, tNode *l = NULL, tNode *r = NULL, tNode *p = NULL){
        nodeValue = value;
        left = l;
        right = r;
        parent = p;
    }
};