编译器似乎不使用包含

Compiler seems to not use includes

我正在定义一个工厂来创建 objects 接口的实现。工厂包括接口 header 以及实现的 header。 类 都在同一个命名空间中。然而,编译器在编译工厂时给出了错误 C2065(IntelliSense 正确地解决了所有问题,如果这很重要的话)

#pragma once
#include <memory>
#include "IDBConnector.hpp"
class IDBConnectorFactory
{
public:
  virtual ~IDBConnectorFactory() { }
  virtual std::shared_ptr<IDBConnector> createDBConnector() = 0; ///<  Create a new object of an implementation of the IDBConnector interface
};

接口定义了很多功能,我认为这些功能对那个问题没有任何作用。所有功能都是纯虚的,在实现中实现。

  #pragma once
  #include <string>
  #include "ConfigFormats.hpp"

  class IDBConnector
  {
  public:
    virtual ~IDBConnector(){};
    virtual bool connect() = 0;
    virtual std::string getSchema() = 0;
    ...
   };

编译器输出为:

  error C2065: "IDBConnector": nichtdeklarierter Bezeichner
  error C2923: "std::shared_ptr": "IDBConnector" ist kein gültiges template-Typargument für den _Ty-Parameter.

英文应该是:

  error C2065: "IDBConnector": undeclared identifier
  error C2923: "std::shared_ptr": "IDBConnector" invalid template argument for the _Ty-Parameter

难道是我搞砸了配置?我试图禁用预编译的使用header,但它并没有改变编译错误。

我使用 doxygen 创建了一个依赖关系图来查看循环依赖关系所在的位置:

我通过将 EDLBackend.hpp 中的内容放入 .cpp 文件并在 EDLBackend.hpp 中转发声明 IDBConnectorFactory 和 IDBConnector 来解决循环问题。 然后我为另一个循环依赖和 tada 做了整个事情,它有效。谢谢大家!

我打赌IDBConnector.hpp开始:

#pragma once
#include <memory>
#include "IDBConnectorFactory.hpp"

扩展它,但包括前几行,我们有:

#pragma once
#include <memory>
    // #pragma once
    // #include <memory>  - skipped
    // #incude "IDBConnector.hpp" - skipped because of #pragma once
    class IDBConnectorFactory
    { ....

所以 IDBConnectorFactory 是在没有定义 IDBConnector 的情况下定义的。

解决方法是 headers 中的一个必须停止包含另一个。你可以 可能从 IDBConnector.hpp 中删除 #include "IDBConnectorFactory.hpp" 并替换为单行:

    class IDConnectorFactory;

(告诉编译器有 class,因此它可以创建引用和指针,但没有详细信息。)

可能您在头文件中使用了 multi-including 保护。 试试这个:

ENABLE_PREPROCESSING   = NO