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

Converting shared_ptr to shared_ptr of same type in different namespace

我有这个 Foo class,其中包含 shared_ptrHotel class,以及对 Rules class 的引用(在 namespaceRules):

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

其中doStuff()方法是这样实现的:

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 位于以下界面中名为 Rulesnamespace 中:

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)

我看到以下内容错误

No suitable user-defined conversion from "std::shared_ptr<Hotel>" to "std::shared_ptr<Rules::Hotel>" exits.

注意 Rules::(可能是因为它来自命名空间)。

我的两个问题:

一定是在 Rules 命名空间的某处有 Hotel class 的错误声明,所以

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 class 的引用。

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

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

如果您确实有不同的 Rules::Hotel class(假设您有充分的理由),您可以将上述声明更改为:

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

为了强制它在全局命名空间中引用 Hotel class。丑,不过C++不是选美比赛