【问题标题】:Error while creating list of template TreeNodes创建模板树节点列表时出错
【发布时间】:2015-01-23 13:16:17
【问题描述】:
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'之前

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

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    跟着错误走

    此行有多个标记 - 需要在 'std::list::&lt;TreeNode*&gt;::iterator' 之前添加 'typename' 因为 'std::list::&lt;TreeNode*&gt;' 是一个依赖范围 - 预期为 ';'在'itr'之前

    你写道:

    list<TreeNode*>::iterator itr;
    

    你需要写:

    typename list<TreeNode*>::iterator itr; 
    

    原因是编译器此时不知道list&lt;TreeNode*&gt;::iterator是嵌套类型还是成员变量,所以你必须告诉它。谁知道呢,list&lt;TreeNode*&gt; 的专业化可能会在其他地方定义 iterator 成为会员!这称为依赖范围,因为iterator 的含义取决于list&lt;TreeNode*&gt; 的实例化。

    【讨论】:

    • 谢谢。它确实有效,尽管我仍然不太清楚解释。是否有任何链接可以让我更详细地阅读此内容?
    • @user489703 试试this reference
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 2022-08-22
    • 2023-03-17
    相关资源
    最近更新 更多