C++ 自定义头文件 - 语法错误 C2061:标识符
C++ Custom Header File - Syntax Error C2061: identifier
我研究语法错误 C2061 已经有一段时间了,我了解到它通常是由头文件的循环依赖引起的。但是,我相信我应该在我的文件中解决这个问题,但我仍然遇到这个问题。
Arc.h
#pragma once
#include <string>
using namespace std;
class Node;
class Arc
{
public:
Arc(Node &p_destination, const string &p_mode);
~Arc();
private:
string m_mode;
Node* m_destination;
};
Node.h
#pragma once
#include <string>
#include <vector>
using namespace std;
class Arc;
class Node
{
public:
Node(const string &p_name, const int &p_identifier, const float &p_latitude, const float &p_longitude);
~Node();
void set_arcs(Arc* p_arc) { m_arcs.push_back(p_arc); } //Line that causes the error
private:
std::vector<Arc*> m_arcs;
//Other Private Variables removed
};
头文件都已经包含在对应的cpp文件中了。任何有关此事的帮助将不胜感激!
编辑:下面是完整的错误消息
"Syntax Error: identifier 'Arc'"
您的文件存在循环依赖。 Arc 依赖于 Node,Node 依赖于 Arx。这是行不通的,因为您必须在 Node 中包含 Arc,并且在 Arc 中包含 Node。
前向声明在这里有点帮助,但您在头文件中放置了一个 using 。你不应该这样做,因为那样你的 Node 和 Arc 就在 std 中。在这里查看进一步的说明。
"using namespace" in c++ headers
问题是名称 "Arc" 已被全局命名空间中的方法使用。要么将您的 class 重命名为未使用的名称,要么将其放置在非全局名称空间的名称空间中。
我研究语法错误 C2061 已经有一段时间了,我了解到它通常是由头文件的循环依赖引起的。但是,我相信我应该在我的文件中解决这个问题,但我仍然遇到这个问题。
Arc.h
#pragma once
#include <string>
using namespace std;
class Node;
class Arc
{
public:
Arc(Node &p_destination, const string &p_mode);
~Arc();
private:
string m_mode;
Node* m_destination;
};
Node.h
#pragma once
#include <string>
#include <vector>
using namespace std;
class Arc;
class Node
{
public:
Node(const string &p_name, const int &p_identifier, const float &p_latitude, const float &p_longitude);
~Node();
void set_arcs(Arc* p_arc) { m_arcs.push_back(p_arc); } //Line that causes the error
private:
std::vector<Arc*> m_arcs;
//Other Private Variables removed
};
头文件都已经包含在对应的cpp文件中了。任何有关此事的帮助将不胜感激!
编辑:下面是完整的错误消息
"Syntax Error: identifier 'Arc'"
您的文件存在循环依赖。 Arc 依赖于 Node,Node 依赖于 Arx。这是行不通的,因为您必须在 Node 中包含 Arc,并且在 Arc 中包含 Node。 前向声明在这里有点帮助,但您在头文件中放置了一个 using 。你不应该这样做,因为那样你的 Node 和 Arc 就在 std 中。在这里查看进一步的说明。 "using namespace" in c++ headers
问题是名称 "Arc" 已被全局命名空间中的方法使用。要么将您的 class 重命名为未使用的名称,要么将其放置在非全局名称空间的名称空间中。