template <typename T>
class BST
{
private:
class TreeNode
{
public:
T data;
TreeNode *left;
TreeNode *right;
TreeNode(const T & d, TreeNode *lchld = NULL, TreeNode *rchld = NULL):
data(d), left(lchld), right(rchld) {}
};
TreeNode *root;
vector<list<TreeNode *> *> createLevelLinkedList(TreeNode *root);
public:
};
template <typename T>
vector< list< typename BST<T>::TreeNode *> *> BST<T>::createLevelLinkedList(TreeNode *root)
{
vector<list<BST<T>::TreeNode *> *> result;
if (root == NULL) return result;
list<TreeNode *> *treeNodeList = new list<TreeNode *>();
int level = 0;
treeNodeList->push_back(root);
result[0] = treeNodeList;
while(true) {
treeNodeList = new list<TreeNode *>();
list<TreeNode *>::iterator itr;
for( itr = (result[level])->begin(); itr != (result[level])->end(); itr++)
{
TreeNode *temp = *itr;
if( temp != NULL)
{
if(temp->right != NULL) treeNodeList->push_back(temp->right);
if(temp->left != NULL) treeNodeList->push_back(temp->left);
}
}
if(treeNodeList->size() > 0)
{
result[level++] = treeNodeList;
} else {
break;
}
}
return result;
}
我正在尝试编译上面的代码,但出现以下代码行的编译错误:
list<TreeNode *>::iterator itr;
错误说明如下:
此行有多个标记 - 在 'std::list::TreeNode*>::iterator' 之前需要 'typename' 因为 'std::list::TreeNode*>' 是依赖范围 - 预期的 ';'在'itr'之前
我尝试了各种选项,但似乎没有任何效果。如果我编译一个非基于模板的代码,它可以工作,但我想编译这个基于模板的代码。有人可以帮我找到问题并建议我解决问题的方法吗?
最佳答案
跟着错误走
Multiple markers at this line - need 'typename' before '
std::list::<TreeNode*>::iterator
' because 'std::list::<TreeNode*>
' is a dependent scope - expected ';' before 'itr'
你写道:
list<TreeNode*>::iterator itr;
你需要写:
typename list<TreeNode*>::iterator itr;
原因是编译器此时不知道是否 list<TreeNode*>::iterator
是嵌套类型还是成员变量,所以你必须告诉它。谁知道呢,可能会有一个专业 list<TreeNode*>
在其他地方定义 iterator
成为成员(member)!这被称为依赖范围,因为 iterator
表示取决于 list<TreeNode*>
的实例化.
关于c++ - 创建模板 TreeNodes 列表时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28110787/