我有两个(实际上是三个,但这里无关紧要)头文件,其中有一个项目的类。一个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*>> "
我不知道发生了什么,感谢任何帮助!
答案 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