C++11 没有从';共享\u ptr<;src::i接口>';至';共享\u ptr<;i接口>';
我试图理解在尝试实现访问者模式进行验证时看到的一个错误。从生成目录执行cmake../时,我收到以下错误: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
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 ")