类模板的C ++成员函数无法识别

时间:2014-02-16 01:39:25

标签: c++ templates binary-tree

我正在开发一个二叉搜索树类并实现一个Find操作。 public函数有两个版本,一个返回一个const Node *并且是const,另一个返回一个非const Node *并且本身不是const。以下是公共定义:

const Node *Find(const T &t) const { Find(t, m_root); }

Node *Find(const T &t) { Find(t, m_root); }

以下是私有Find方法的定义:

template <typename T>
const Node* CTree<T>::Find(const T &t, Node *root) const {
    if (root == 0)
        return Node();
    else if (t < root->m_number)
        Find(t, root->m_ll);
    else if (t > root->m_number)
        Find(t, root->m_rl);
    else
        return this;
}

Visual Studio告诉我“'查找':成员函数未在'CTree'中声明”。为什么会这么说?

编辑以添加错误消息的细节: 从const Node*...

开始的私有方法定义行有5条消息

Missing type specifier - int assumed

Syntax error : missing ';' before '*'

'T' : undeclared identifier

'CTree' : 'T' is not a valid template type argument for parameter 'T'

syntax error : missing ',' before '&'

然后又为定义的右大括号输出了一个错误(这是我认为导致其他5个错误的那个):

'Find' : member function not declared in 'CTree'

作为一个注释,Visual Studio并没有像Node那样在Find的定义中突出显示{{1}}。

以下是全班:http://pastebin.com/JEEZJD4n

1 个答案:

答案 0 :(得分:1)

错误在方法定义中(pastebin的第93行):

template <typename T>
const Node* CTree<T>::Find(const T &t, Node *root) const {

您在全局范围内没有任何类型Node,因为嵌套了class Node。因此,首先修复将添加父类限定条件:

template <typename T>
const CTree<T>::Node* CTree<T>::Find(const T &t, Node *root) const {

但是,还有另一个问题:现在,编译器无法正确解析它。您必须添加typename关键字,以表示嵌套类型:

template <typename T>
const typename CTree<T>::Node* CTree<T>::Find(const T &t, Node *root) const {

有关详细信息,请参阅“When is the “typename” keyword necessary?”。

注意:

  • 如果将方法定义直接放到类主体(取决于您的代码样式),则可以避免任何这些问题。
  • 如果您可以使用不同的编译器,您可以广泛地丰富您的编码体验,并使您的模板编码更高效。请注意g++如何在此类错误中更清晰:

    main.cpp : At global scope :
    main.cpp : 104 : 7 : error : 'Node' does not name a type
    const Node* CTree<T>::Find(const T &t, Node *root) const
          ^
    
    main.cpp: At global scope:
    main.cpp:104:7: error: need 'typename' before 'CTree<T>::Node' 
    because 'CTree<T>' is a dependent scope
    const CTree<T>::Node* CTree<T>::Find(const T &t, Node *root) const
          ^