将shared_ptr转换为不同命名空间中相同类型的shared_ptr

时间:2015-12-26 02:19:49

标签: c++ c++11 shared-ptr smart-pointers

我有Foo class,其中包含shared_ptrHotel class,以及对Rules class的引用(位于namespace {{ 1}}):

Rules

以这种方式实现doStuff()方法:

class Foo
{
public:
   //...
   void doStuff();
private:
   std::shared_ptr<Hotel> mHotelClicked;
   Rules::IRules& mRules;
}

void Foo::doStuff() { //... std::shared_ptr<Hotel> p = hotel; //Here I need to pass both smart pointers if(mRules.isValidMove(mHotelClicked,p) == true) //ERROR here! See bellow. { //... } } 位于以下界面中名为Rules的{​​{1}}内:

namespace

错误:

Rules

当我将鼠标悬停在:

上时
namespace Rules
{
  class IRules
  {
  public:
    virtual bool isValidMove(std::shared_ptr<Hotel> hotel1, std::shared_ptr<Hotel> hotel2) = 0;
    //...
  };
}

我看到以下错误

error C2664: 'Rules::IRules::isValidMove' : cannot convert parameter 1 from 'std::shared_ptr<_Ty>' to 'std::shared_ptr<_Ty>'

注意mRules.isValidMove(mHotelClicked,p) (可能是因为它来自命名空间)。

我的两个问题:

  • [1] 如何修复此错误?既然两个参数都是相同的类型?两者都是酒店类的智能指针。

  • [2] 这样做的最佳做法是什么?我应该通过引用传递吗?

1 个答案:

答案 0 :(得分:3)

必须发生的事情是Rules命名空间中的某个地方错误地声明了Hotel类,所以

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;

而不是对全局命名空间中Hotel类的引用。

当对命名空间内的类进行非限定引用时,编译器首先检查该类是否存在于命名空间内,然后检查全局命名空间(这有点简化,还有一些其他规则,但旁边是要点)。

我猜测你没有显示的头文件中的Rules::Hotel声明是错误的。您需要找到它,并通过在Rules命名空间之外声明它来修复它。

如果你确实有一个不同的Rules::Hotel课程(假设你有充分的理由),你可以将上述声明改为:

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

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