Clang error: member access into incomplete type

Clang error: member access into incomplete type

我有一个非常简单的星座,来自两个classes "Id"和"IdValidator"及其对应的接口。 Bought classes 相互依赖,即它们之间存在循环依赖。循环依赖的问题通过使用前向声明来解决。一切都在用 clang 编译和链接,即 git commit : e4d4edafa924fad8902c52a10a2c0ebbd39907bf from branch master

然后我开始需要将这两个 class 拆分到不同的命名空间中。我所做的只是在不修改工作版本的情况下创建了两个目录并将相应的 class 及其接口放在第二个目录中。更改了命名空间和相应的包含。

我能够执行 "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;"。我不确定如何解决这个问题,因此在这里寻求帮助。 其他文章建议包含有问题的文件,但这在这种情况下没有帮助,即

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 repoIdInterface 是在命名空间 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;

    };

}