【问题标题】:C++ member function of class template not recognized类模板的 C++ 成员函数无法识别
【发布时间】:2014-02-17 02:20:34
【问题描述】:

我正在研究二叉搜索树类并实现查找操作。公共函数有两个版本,一个返回一个 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 告诉我“'Find' : member function not declared in '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 '&amp;'

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

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

请注意,Visual Studio 没有像其他地方那样在 Find 的定义中突出显示 Node

这是整个班级:http://pastebin.com/JEEZJD4n

【问题讨论】:

  • 您没有发布任何可以帮助您的信息。发送整个错误消息,它发生的行。是你们全班吗?
  • 我编辑了我的问题以包含错误信息。不,这不是全班,但我相信它应该足以帮助我解决问题。
  • 可能有一些语法错误。我无法弄清楚是什么导致了问题。我至少需要方法和属性的完整类定义。应该编译的东西。
  • 好的,我放了一个全班的 pastebin 链接。
  • @spartanhooah JEEZ!你的 pastebin 网址太棒了! =)

标签: c++ templates binary-tree


【解决方案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
          ^
    

【讨论】:

  • 感谢您的帮助。在我的前两个 C++ 课程中,我被教导要拆分声明和定义。我已经了解了模板化函数和类,但这是我第一次遇到嵌套类。
猜你喜欢
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多