尝试从函数传递并返回一组指针时发生C ++错误

时间:2019-05-24 18:52:35

标签: c++ pointers compiler-errors namespaces set

我有两个(实际上是三个,但这里无关紧要)头文件,其中有一个项目的类。一个Node类包括一组指向其他节点的指针(它像一棵树),另一类是图类(标题为AML),它包含一组指向所有节点的指针。它们各自的层。

我想编写自己的C ++ set操作(因为我将需要它们),所以我决定声明一个具有set操作功能的名称空间。但是,当我尝试在我的Node类中使用这些set操作时,出现错误。以下是相关代码:

aml.h

#pragma once
#include <set>
#include "Node.h"
#include "constant.h"

using namespace std;
class aml
{
// class stuff
};

namespace setops {
    set<Node*> set_union(set<Node*>  &a, set<Node*>  &b);
    // other set operations
}

aml.cpp

#include "aml.h"

using namespace std;


//class functions

set<Node*> setops::set_union(set<Node*>  &a, set<Node*>  &b) {
    set<Node*> c;
    for (Node* data : a) {
        c.insert(data);
    }
    for (Node* data : b) {
        c.insert(data);
    }

    return c;
}

Node.h

#pragma once
#include <string>
#include <set>
#include "aml.h"
#include "constant.h"

using namespace std;
class Node
{
private:
    set<Node*> lower;
public:
    set<Node*> getLower();
    set<Node*> GL();
};

,这里是发生错误的GL()方法。这应该返回通过向下移动到树可以到达的所有节点的集合。 getLower()返回包含所有节点子节点的lower集。

Node.cpp

#include "Node.h"

set<Node*> Node::getLower() {
    return this->lower;
}

set<Node*> Node::GL() {
    set<Node*> lowerSet;
    lowerSet.insert(this);
    if (this->lower.size() == 0) {
        return lowerSet;
    }
    set<Node*> recurse;
    for (Node* node : this->lower) {
        recurse = node->GL();
        lowerSet = setops::set_union(lowerSet, recurse); //This is the error line
    }
    return lowerSet;
}

我标记了问题线。它实际上有三个错误,每个参数一个,等号之一。错误说(它们几乎都一样,但这是参数一)

a reference of type "set::set<<error-type>*, std::less<<error-type>*>, std::allocator<<error-type>*>& "(non-const qualified) cannot be initialized with a value of type "set::set<Node*, std::less<Node*>, std::allocator<Node*>> "

我不知道发生了什么,感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

您具有循环依赖关系,node.h包含aml.h,反之亦然。在node.h之后将aml.h包含到node.cpp中。

问题是两个标头必须同时使用,因为一个头依赖于另一个头。这是不良架构的标志。

考虑:1)在aml.h中转发声明节点,并继续使用循环或合并标头。 2)制作操作模板功能。 3)将好奇的递归模板用于Node类4)结合使用它们。

请勿在标题中使用using namespace。这可能会给您或使用标题的其他人带来问题,尤其是如果您自己“玩”嵌套的名称空间时。在最坏的情况下,您可以编写“ using std :: set;”明确使用该名称。

您真的需要std::set吗?

PS。在C ++ 17中,有std::set

的合并方法