c++11 - Clang 错误 : member access into incomplete type

标签 c++11 namespaces c++17 circular-dependency forward-declaration

我有一个非常简单的星座,来自两个类“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/

相关文章:

python - URL 处出现 NoReverseMatch 错误,X 未注册命名空间

c++ - 在另一个进程中销毁共享的 std::vector

c++ - 在 constexpr 构造函数中获取一个特殊的指针值(类似于 "second"nullptr)

c++ - std::forward 在参数传递中的用法是什么?

c++ - 字符串的 decltype 和 const 引用返回类型

c++ - 如何保存 std::mersenne_twister_engine 的状态以便稍后恢复?

找不到带有命名空间的 PHP 类

c++ - 多个命名空间的命名冲突?

c++ - 为什么无法识别我重载的乘法运算符?

c++ - 使用 C++ 异常的内存泄漏