编译器似乎不使用包含
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
我正在定义一个工厂来创建 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