我正在处理一个二进制搜索树类,并实现一个查找操作。公共函数有两个版本,一个返回一个const节点*,它是const,另一个返回一个非const节点*,而它本身并不是const。以下是公开的定义:
const Node *Find(const T &t) const { Find(t, m_root); }
Node *Find(const T &t) { Find(t, m_root); }
以下是私有查找方法的定义:
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告诉我"'Find‘:成员函数在’CTree‘中没有声明“。它为什么要这么说?
编辑以添加错误消息的细节:有5条用于启动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并没有像在其他地方那样突出显示Node
在Find
定义中的作用。
以下是全班学生:http://pastebin.com/JEEZJD4n
发布于 2014-02-16 10:09:16
方法定义中有错误(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:在全局范围: main.cpp: 104 :7: main.cpp:' Node‘不命名类型const Node* CTree::Find(const T &t,Node *root) const ^ main.cpp :在全局范围:main.cpp:104:7: error:需要'typename’之前的‘CTree::节点’,因为'CTree‘是一个依赖范围const::节点* CTree::Find(const T &t,Node *root)https://stackoverflow.com/questions/21806156
复制相似问题