0

连接器.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

连接.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:语法错误:缺少 ';' 在标识符“所有者_”之前 c:\a\b\c\connection.hpp 42 1 测试

错误 2 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int c:\a\b\c\connection.hpp 42 1 test

问题是 VS 编辑器没有看到任何问题 - 没有红色下划线等。包含路径设置正确,我已添加$(SolutionDir)\..\到包含中,以便我可以使用完整路径a/b/c而不是相对路径。

尽管如此,这并没有编译..但它编译过一次。

问:为什么?

4

2 回答 2

3

通常这些循环#include指令是致命的。这肯定是这里正在发生的事情。假设您#include "connector.hpp"在其他文件中。将会发生的事情是 connector.hpp 将#include "connection.hpp". 该文件将依次#include "connector.hpp"执行,但现在这是一个空操作,因为 connector.hpp 的包含防护已经处于活动状态。你最终得到的是class connection之前定义的class connector。这是一个问题,因为数据成员 inclass connectionclass connector.

为什么connector.hpp包含connection.hpp?

于 2012-10-06T20:00:32.597 回答
0

在我看来你有包含循环。

即你包括connection.hppconnector.hppconnector.hppconnection.hpp

省略#include <a/b/c/connection.hpp>in connector.hpp

我认为问题可能是编译器开始编译connector.hpp然后预处理器看到用 .hpp 文件的内容#include <a/b/c/connection.hpp>替换#include(粗略地说)当它尝试包含 connector.hpp 时,它会检查防护并看到它__CONNECTOR_HPP_已定义并跳过它并且由于class connector尚未声明它会产生此错误。

PS:哦,没关系,我看到它已经回答了。

于 2012-10-06T20:15:39.267 回答