Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将不同命名空间中相同类型的共享\u ptr转换为共享\u ptr_C++_C++11_Shared Ptr_Smart Pointers - Fatal编程技术网

C++ 将不同命名空间中相同类型的共享\u ptr转换为共享\u ptr

C++ 将不同命名空间中相同类型的共享\u ptr转换为共享\u ptr,c++,c++11,shared-ptr,smart-pointers,C++,C++11,Shared Ptr,Smart Pointers,我有一个Foo类,其中包含一个酒店类的共享ptr,以及一个规则类(位于命名空间规则内)的引用: 错误: error C2664: 'Rules::IRules::isValidMove' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::shared_ptr<_Ty>' 我看到以下错误: No suitable user-defined conversion from "std::shar

我有一个
Foo类
,其中包含一个
酒店类
共享ptr
,以及一个
规则类
(位于
命名空间
规则
内)的引用:

错误:

error C2664: 'Rules::IRules::isValidMove' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::shared_ptr<_Ty>'
我看到以下错误

No suitable user-defined conversion from "std::shared_ptr<Hotel>" to "std::shared_ptr<Rules::Hotel>" exits.
不存在从“std::shared_ptr”到“std::shared_ptr”的合适的用户定义转换。
注意
规则::
(可能是因为它来自名称空间)

我的两个问题:

  • [1]如何修复此错误?因为两个参数都是同一类型?这两个都是酒店类的智能指针

  • [2]这样做的最佳实践是什么?我应该通过引用来代替吗


必须发生的是,在
规则
名称空间的某个地方有一个错误的
酒店
类声明,因此

virtual bool isValidMove(std::shared_ptr<Hotel> hotel1, std::shared_ptr<Hotel> hotel2) = 0;

为了强制它引用全局命名空间中的
Hotel
类。丑陋,但是C++不是一个选美比赛。

必须发生的是,在<代码>规则>代码>命名空间中,有错误的声明<代码>酒店< /代码>类,所以

virtual bool isValidMove(std::shared_ptr<Hotel> hotel1, std::shared_ptr<Hotel> hotel2) = 0;

为了强制它引用全局命名空间中的
Hotel
类。丑陋,但是C++不是一个选美比赛。< /P>你有两个相同的类,叫做酒店,在不同的命名空间中定义吗?如果是这样,很难找到理由。不,Hotel类只定义了一次,没有任何名称空间。只有Rules类有自己的namespace.Ohhh。那么,很抱歉--恐怕我无法理解这一点。编译器认为您在名称空间
规则
中以及在全局名称空间中都有
Hotel
的定义。认识到
::Hotel
Rules::Hotel
是两个截然不同的、完全不相关的类。您是否有可能在
名称空间规则{}
中包含“Hotel.h”
,或者类似的内容?如果是这样,停止。除了@IgorTandetnik的建议外,您是否可以检查是否在命名空间
规则
中转发
Hotel
的声明,您是否有两个相同的类,称为Hotel,在不同的命名空间中定义?如果是这样,很难找到理由。不,Hotel类只定义了一次,没有任何名称空间。只有Rules类有自己的namespace.Ohhh。那么,很抱歉--恐怕我无法理解这一点。编译器认为您在名称空间
规则
中以及在全局名称空间中都有
Hotel
的定义。认识到
::Hotel
Rules::Hotel
是两个截然不同的、完全不相关的类。您是否有可能在
名称空间规则{}
中包含“Hotel.h”
,或者类似的内容?如果是,请停止。除了@IgorTandetnik的建议外,您是否可以检查一下您是否转发了
酒店
内部命名空间
规则
的声明,谢谢大家!Hotel类确实在规则名称空间内转发声明!:)谢谢谢谢大家!!Hotel类确实在规则名称空间内转发声明!:)谢谢
mRules.isValidMove(mHotelClicked,p)
No suitable user-defined conversion from "std::shared_ptr<Hotel>" to "std::shared_ptr<Rules::Hotel>" exits.
virtual bool isValidMove(std::shared_ptr<Hotel> hotel1, std::shared_ptr<Hotel> hotel2) = 0;
virtual bool isValidMove(std::shared_ptr<Rules::Hotel> hotel1, std::shared_ptr<Rules::Hotel> hotel2) = 0;
virtual bool isValidMove(std::shared_ptr<::Hotel> hotel1, std::shared_ptr<::Hotel> hotel2) = 0;