Clang错误:成员访问不完整的类型



我有一个非常简单的星座,来自两个类"Id"one_answers"IdValidator"及其相应的接口。购买的类相互依赖,即购买的类之间存在循环依赖关系。循环依赖关系的问题通过使用前向声明来解决。所有这些都可以通过clang进行编译和链接,即gitcommit:e4d4edafa924fad8902c52a10a2c0ebbd39907bf来自分支主机

然后我需要将这两个类拆分到不同的名称空间中。我所做的只是在不修改工作版本的情况下创建了两个目录,并将相应的类和它的interfaec放在第二个目录中。更改了名称空间和相应的包含。

我可以执行"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

以下是有问题的文件:

IdValidator.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

IdValidator.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;
}
}

IdValidatorInterface.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

编译器基本上是在抱怨头文件IdValidatorInterface.h中的前向声明"class IdInterface;"。我不知道如何解决这个问题,因此在这里寻求帮助。其他文章建议包括有问题的文件,但在这种情况下没有帮助,即

成员访问不完整类型"QScrollBar">

成员访问不完整类型';CALayer';

这在c++中可行吗?或者它们必须在同一个命名空间和同一个文件夹中才能工作。我真的很想把这两者分开。

我使用的是clang 6.0.1版本(emscripten 1.38.12:1.38.12(目标:x86_64-unknown-linux-gnu线程型号:posix

看起来像是在文件范围内转发声明IdInterface。看看您链接的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;
};
}

最新更新