C++11 没有从';共享\u ptr<;src::i接口>';至';共享\u ptr<;i接口>';

C++11 没有从';共享\u ptr<;src::i接口>';至';共享\u ptr<;i接口>';,c++11,c++17,visitor-pattern,C++11,C++17,Visitor Pattern,我试图理解在尝试实现访问者模式进行验证时看到的一个错误。从生成目录执行cmake../时,我收到以下错误: validator/src/Id.cpp:30:38: error: no viable conversion from 'shared_ptr<src::IdInterface>' to 'shared_ptr<IdInterface>' bool isValid = validator->isValid( castedObj

我试图理解在尝试实现访问者模式进行验证时看到的一个错误。从生成目录执行cmake../时,我收到以下错误:

validator/src/Id.cpp:30:38: error: no viable conversion from 'shared_ptr<src::IdInterface>' to 'shared_ptr<IdInterface>'
                bool isValid = validator->isValid( castedObj );

/home/tito/Projects/validator/src/IdValidatorInterface.h:24:50: note: passing argument to parameter 'entity' here
                 virtual bool isValid( shared_ptr<IdInterface> entity )  = 0;
第一个问题是: “没有从“共享”到“共享”的可行转换”

这里我看到的唯一区别是完全限定的名称空间。我想了解这一错误的性质,即根源。这与我传递给clang的编译定义有关吗

add_definitions(" -pedantic -pedantic-errors -W ")
add_definitions(" -Wall -Wextra  -Werror -Wshadow -Wnon-virtual-dtor ")
add_definitions(" -v ")
或者别的什么

我在stackoverflow中找到了多篇关于这方面的文章,但所有这些文章都主要是关于不同类型的,比如bools和string

像这个

我确实理解上面提到的文章,但在我的例子中,编译器看到的是相同的类型,只是名称空间不同,即“shared_ptr”和“shared_ptr”如何告诉编译器这些是相同的对象?当这是同一个类,即“IdInterface”时,为什么编译器会看到不同的名称空间。在上面的一些文章中提到,如果未定义中的类,则可以看到此错误,但出于这个原因,我使用了explicetelly fotrward声明

我已经将这3个类和3个接口放在github上,以展示完整的图片


非常感谢您的帮助

错误消息表明您有两个
IdInterface
定义,一个在名称空间
src
中,另一个在全局名称空间中。这是两个不同的、不相关的实体。你的前向声明,
类接口,很可能是在错误的命名空间中。哇,你是对的,我不敢相信这么简单。谢谢我修复了repo,它现在可以编译了。
shared_ptr<Id> thisObj = shared_from_this();
shared_ptr<IdInterface> castedObj = static_pointer_cast<IdInterface>(thisObj);

bool isValid = validator->isValid( castedObj );
namespace src {

class BasePrimitive: public enable_shared_from_this<BasePrimitive> {

public:
    ~BasePrimitive();
    BasePrimitive();

};

}
#include "IdValidator.h"
#include "Id.h"
#include "IdInterface.h"

using namespace std;

namespace src
    {

    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;

        }
    }
class IdInterface;
add_definitions(" -pedantic -pedantic-errors -W ")
add_definitions(" -Wall -Wextra  -Werror -Wshadow -Wnon-virtual-dtor ")
add_definitions(" -v ")