connector.hpp
#ifndef __CONNECTOR_HPP_
#define __CONNECTOR_HPP_
#include <a/b/c/connection.hpp>
namespace a {
namespace b {
namespace c {
class connector {
public:
explicit connector(const int port);
void run();
void stop();
};
}
}
}
#endif
connection.hpp
#ifndef __CONNECTION_HPP_
#define __CONNECTION_HPP_
#include <a/b/c/connector.hpp>
namespace a {
namespace b {
namespace c {
class connection {
private:
connector owner_; //line 42
};
}
}
}
#endif
这些简单的类在cpp文件中有一些简单的(空)实现。
当我尝试编译时VS2012说这个:
错误1错误C2146:语法错误:缺少';'在标识符'owner_'c之前:\ a \ b \ c \ connection.hpp 42 1 test
错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int c:\ a \ b \ c \ connection.hpp 42 1 test
问题是VS编辑器没有看到任何问题 - 没有红色下划线等。
包含路径设置正确,我已将$(SolutionDir)\..\
添加到包含内容,以便我可以使用a/b/c
之类的完整路径而不是相对路径。
尽管如此,这并没有编译......但它只做了一次。
问:为什么?
答案 0 :(得分:3)
这些循环#include
指令通常都是致命的。这肯定是这里发生的事情。假设您在其他文件中#include "connector.hpp"
。会发生什么是connector.hpp将#include "connection.hpp"
。此文件将依次为#include "connector.hpp"
,但现在这是一个无操作,因为connector.hpp的包含保护已经处于活动状态。您最终得到的是在class connection
之前定义class connector
。这是一个问题,因为class connection
中的数据成员是class connector
的实例。
为什么connector.hpp包括connection.hpp?
答案 1 :(得分:0)
在我看来,你已经包含了循环。
即您在connection.hpp
和connector.hpp
中connector.hpp
包含connection.hpp
忽略connector.hpp中的#include <a/b/c/connection.hpp>
我认为问题可能是编译器开始编译connector.hpp
然后预处理器看到#include <a/b/c/connection.hpp>
用.hpp文件的内容替换#include
(粗略地说)当它尝试时要包含connector.hpp,它会检查警卫并看到__CONNECTOR_HPP_
已定义并跳过它,因为class connector
尚未声明它会产生此错误。