我有一个非常简单的星座,来自两个类“Id”和“IdValidator”及其相应的接口(interface)。购买的类相互依赖,即购买的类之间存在循环依赖关系。循环依赖的问题是通过使用前向声明解决的。所有这些都可以使用 clang 进行编译和链接,即 git commit :e4d4edafa924fad8902c52a10a2c0ebbd39907bf从分支主
然后我开始需要在不同的命名空间中拆分这两个类。我所做的只是没有修改工作版本,我创建了两个目录并将相应的类和它的接口(interface)放在第二个目录中。更改了命名空间和相应的包含。
我能够执行“cmake ../”,但是当我运行“make”时,我面临以下错误:
当我现在编译以前的工作示例时,出现错误
visitor/validator/IdValidator.cpp:36:23: error: member access into incomplete type 'std::__shared_ptr_access<IdInterface, __gnu_cxx::_S_atomic, false, false>::element_type'
(aka 'IdInterface')
string name = entity->getName();
^
visitor/validator/IdValidatorInterface.h:12:7: note: forward declaration of 'IdInterface'
class IdInterface;
非工作版本的 4 个文件在此处拆分的分支中,即提交 58345716e9b4a6062a470519690502b5fb80662a
这是有问题的文件:
身份验证器.h
#ifndef _ID_VALIDATOR_
#define _ID_VALIDATOR_
#include <string>
#include <vector>
#include <limits>
#include <memory>
#include "../src/Id.h"
#include "IdValidatorInterface.h"
namespace validator
{
using Id = src::Id;
using IdValidatorInterface = src::IdValidatorInterface;
class IdValidator : public virtual IdValidatorInterface
{
public:
IdValidator();
virtual ~IdValidator();
virtual bool isValid( shared_ptr<IdInterface> entity) override;
vector<string> validate(shared_ptr<IdInterface> entity) override;
};
}
#endif
身份验证器.cpp
#include "IdValidator.h"
#include "../src/Id.h"
#include "../src/IdInterface.h"
using namespace std;
namespace validator
{
using Id = src::Id;
IdValidator::IdValidator()
{
}
bool IdValidator::isValid(shared_ptr<IdInterface> entity)
{
vector<string> listOfErros = validate(entity);
if(listOfErros.empty() ){
return false;
}else{
return true;
}
}
vector<string> IdValidator::validate(shared_ptr<IdInterface> entity)
{
vector<string> stringList = vector<string>();
// do some validation of the name
string name = entity->getName();
if (name == "BadName")
{
string error = "Error. id name is bad";
stringList.push_back(error);
return stringList;
}
return stringList;
}
}
身份验证器接口(interface).h
#ifndef _ID_VALIDATOR_INTERFACE_
#define _ID_VALIDATOR_INTERFACE_
#include "BaseElementValidatorInterface.h"
#include <string>
#include <memory>
#include <vector>
using namespace std;
class IdInterface;
namespace validator
{
class IdValidatorInterface : public virtual BaseElementValidatorInterface
{
public:
IdValidatorInterface();
virtual ~IdValidatorInterface();
virtual bool isValid( shared_ptr<IdInterface> entity ) = 0;
virtual vector<string> validate( shared_ptr<IdInterface> entity) = 0;
};
}
#endif
编译器基本上是在提示前向声明“class IdInterface;”在头文件 IdValidatorInterface.h 中。我不知道如何解决这个问题,因此在这里寻求帮助。
其他文章建议包含有问题的文件,但这在这种情况下无济于事,即
member access into incomplete type ‘QScrollBar’
Member access into incomplete type 'CALayer'
这在 C++ 中是否可行,或者它们是否必须位于相同的命名空间和相同的文件夹中才能使其工作。我真的很想把这两个分开。
我正在使用 clang 版本 6.0.1 (emscripten 1.38.12 : 1.38.12)
目标:x86_64-unknown-linux-gnu
线程模型:posix
最佳答案
看来你转发声明IdInterface
在文件范围内。看着你的 linked github repo , IdInterface
在命名空间 src
中定义. src::IdInterface != ::IdInterface
您已经向前声明了一个从未定义的类型。
将您的前向声明更新为 namespace src
它可能会解决您的问题。
namespace src{
class IdInterface;
}
namespace validator
{
class IdValidatorInterface : public virtual BaseElementValidatorInterface
{
public:
IdValidatorInterface();
virtual ~IdValidatorInterface();
virtual bool isValid( shared_ptr<src::IdInterface> entity ) = 0;
virtual vector<string> validate( shared_ptr<src::IdInterface> entity) = 0;
};
}
关于c++11 - Clang 错误 : member access into incomplete type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58671723/