【问题标题】:C++ Vector datatype compiler error issue with a member of my defined Class我定义的类的成员的 C++ Vector 数据类型编译器错误问题
【发布时间】:2014-05-31 11:28:43
【问题描述】:

我正在尝试学习 C++ 作为一种兴趣,但在尝试合并 Vector 容器时遇到了一个问题。

任何人都可以帮助我,我正在尝试将向量迭代器合并到我的类中,但是我在这一行 std::cout << nodeIterator->data; 上遇到编译错误,下面是我的代码 sn-ps。

我得到的错误:

错误:在“* nodeIterator”中请求成员“数据”。 __gnu_cxx::__normal_iterator::operator-> [with _Iterator = const FibTree::Node**, _Container = std::vector >]()',属于非类类型'const FibTree::Node*' 1234565>
class Node {
    public:
        int data;
        Node const* left;
        Node const* right;
        Node const* parent;
        int n;
        int level;
        int index;

        Node (void);

};

// Get root method
Node const* getRoot(void) {
    return this->root;
}

void start(Node const* root) {
    std::vector<Node const*> setsList;
    std::cout << root->data; 
writeSets(setsList, root);
}

writeSets(std::vector<Node const*> &setsList, Node const* cur) {

    std::vector<Node const*>::iterator nodeIterator;

    // Displays all preceding left values
    for (nodeIterator = setsList.begin();nodeIterator != setsList.end(); nodeIterator++)
    {
        std::cout << nodeIterator->data; //*** Get Compile error this line ***
    }

    std::cout << cur->left->data;
    std::cout << cur->right->data;

    setsList.push_back(cur->left);
    writeSets(setsList,cur->right);
    setsList.pop_back();
}

谁能给我一些建议?

非常感谢

【问题讨论】:

    标签: c++ vector compiler-errors stdvector


    【解决方案1】:

    这是罪魁祸首:

    Iterator = const FibTree::Node**
    

    因此,当您编写nodeIterator-&gt;data 时,您是从没有此类成员的const FibTree::Node** 请求data,因此会出现错误。你需要

    (*nodeIterator)->data
    

    edit 除此之外,您的代码无法编译:writeSets 没有返回类型,getRoot 尝试访问 this,这在非成员函数中无法完成,并且startwriteSets 之前声明。下次请发布重现错误的确切代码:https://stackoverflow.com/help/mcve

    【讨论】:

    • 非常感谢 - 您强调了这个问题。为什么const FibTree::Node** 没有这样的data 成员?你能告诉我括号在这里做什么,以便能够访问data 成员。抱歉,我还有很多东西要学。
    • Node** 是一个指向指针的指针,更具体地说,它是一个指向 Node* 的指针 - 使用 -&gt; 您可以访问所指向内容的成员。所以如果你有一个Node* 类型的变量,那没关系,因为Node 本身有一个data 成员。但不适用于Node**。这就是你使用*nodeIterator的原因,这里*用于取消引用指针,取消引用Node**的结果是Node*,这就是你需要的。
    • 如果上面的内容对您来说听起来像是中文(或任何其他您不会说的语言),请从一些基本教程开始,或在 StackOverflow 上搜索。然后,在列表和向量上寻找一些更高层次的东西:你似乎试图用上面的代码实现的整个前提似乎是错误的(即双向链表的节点向量)
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多