我正在开发一个二叉搜索树类并实现一个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*...
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}}。
答案 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
^