Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建模板树节点列表时出错 模板 BST级 { 私人: 三烯类 { 公众: T数据; TreeNode*左; TreeNode*对; TreeNode(常量T&d,TreeNode*lchld=NULL,TreeNode*rchld=NULL): 数据(d),左(lchld),右(rchld){ }; 树根; 向量createLevelLinkedList(TreeNode*根); 公众: }; 模板 vectorBST::createLevelLinkedList(TreeNode*根) { 矢量结果; if(root==NULL)返回结果; list*treeNodeList=新列表(); 智力水平=0; treeNodeList->push_back(根目录); 结果[0]=树型列表; while(true){ treeNodeList=新列表(); 列表::迭代器itr; 对于(itr=(结果[级别]->开始();itr!=(结果[级别]->结束();itr++) { 树节点*温度=*itr; 如果(温度!=NULL) { 如果(temp->right!=NULL)treeNodeList->push_back(temp->right); 如果(temp->left!=NULL)treeNodeList->push_back(temp->left); } } 如果(treeNodeList->size()>0) { 结果[level++]=treeNodeList; }否则{ 打破 } } 返回结果; }_C++_Templates - Fatal编程技术网

C++ 创建模板树节点列表时出错 模板 BST级 { 私人: 三烯类 { 公众: T数据; TreeNode*左; TreeNode*对; TreeNode(常量T&d,TreeNode*lchld=NULL,TreeNode*rchld=NULL): 数据(d),左(lchld),右(rchld){ }; 树根; 向量createLevelLinkedList(TreeNode*根); 公众: }; 模板 vectorBST::createLevelLinkedList(TreeNode*根) { 矢量结果; if(root==NULL)返回结果; list*treeNodeList=新列表(); 智力水平=0; treeNodeList->push_back(根目录); 结果[0]=树型列表; while(true){ treeNodeList=新列表(); 列表::迭代器itr; 对于(itr=(结果[级别]->开始();itr!=(结果[级别]->结束();itr++) { 树节点*温度=*itr; 如果(温度!=NULL) { 如果(temp->right!=NULL)treeNodeList->push_back(temp->right); 如果(temp->left!=NULL)treeNodeList->push_back(temp->left); } } 如果(treeNodeList->size()>0) { 结果[level++]=treeNodeList; }否则{ 打破 } } 返回结果; }

C++ 创建模板树节点列表时出错 模板 BST级 { 私人: 三烯类 { 公众: T数据; TreeNode*左; TreeNode*对; TreeNode(常量T&d,TreeNode*lchld=NULL,TreeNode*rchld=NULL): 数据(d),左(lchld),右(rchld){ }; 树根; 向量createLevelLinkedList(TreeNode*根); 公众: }; 模板 vectorBST::createLevelLinkedList(TreeNode*根) { 矢量结果; if(root==NULL)返回结果; list*treeNodeList=新列表(); 智力水平=0; treeNodeList->push_back(根目录); 结果[0]=树型列表; while(true){ treeNodeList=新列表(); 列表::迭代器itr; 对于(itr=(结果[级别]->开始();itr!=(结果[级别]->结束();itr++) { 树节点*温度=*itr; 如果(温度!=NULL) { 如果(temp->right!=NULL)treeNodeList->push_back(temp->right); 如果(temp->left!=NULL)treeNodeList->push_back(temp->left); } } 如果(treeNodeList->size()>0) { 结果[level++]=treeNodeList; }否则{ 打破 } } 返回结果; },c++,templates,C++,Templates,我正在尝试编译上述代码,但在以下代码行中出现编译错误: template <typename T> class BST { private: class TreeNode { public: T data; TreeNode *left; TreeNode *right; TreeNode(const T & d, TreeNode *lchld = NULL, TreeNode *rch

我正在尝试编译上述代码,但在以下代码行中出现编译错误:

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::迭代器itr;
错误说明如下:

这条线上有多个标记 -在“std::list::TreeNode*>::iterator”之前需要“typename”,因为 “std::list::TreeNode*>”是一个从属作用域 -期望“;”在“itr”之前

我尝试了各种选择,但似乎没有任何效果。如果我编译一个非基于模板的代码,它可以工作,但我想编译这个基于模板的代码。有人能帮我找到问题并给我建议解决方法吗?

只要跟着错误走就行了

此行的多个标记-需要在“
std::list::::iterator
”之前加上“typename”
,因为“
std::list::
”是一个依赖范围-应为“;”在“itr”之前

你写道:

list<TreeNode *>::iterator itr;
list::迭代器itr;
你需要写:

list<TreeNode*>::iterator itr;
typename列表::迭代器itr;

原因是编译器此时不知道
list::iterator
是嵌套类型还是成员变量,因此必须告诉它。谁知道呢,在其他地方可能会有一个专门化的
list
,它将
迭代器定义为一个成员!这被称为依赖范围,因为
迭代器
的含义取决于
列表
的实例化。它确实起作用,尽管我对解释还不是很清楚。有什么链接可以让我更详细地阅读吗?@user489703
typename list<TreeNode*>::iterator itr;