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



我有这个Foo class,它包含一个shared_ptrHotel class,以及一个对Rules class(位于namespace Rules内部)的引用:

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::(可能是因为它来自名称空间)。

我的两个问题:

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

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

必须发生的是,在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;

而不是引用全局命名空间中的CCD_ 13类。

当存在对命名空间中的类的非限定引用时,编译器首先检查该类是否存在于命名空间中,然后检查全局命名空间(这在某种程度上有所简化,还有一些其他规则,但这与重点无关)。

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

如果您确实有一个不同的Rules::Hotel类(假设您有充分的理由这样做),您可以将上面的声明更改为:

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

以便强制其引用全局命名空间中的CCD_ 17类。很丑陋,但C++不是一场选美比赛。

相关内容

  • 没有找到相关文章

最新更新