将 shared_ptr 转换为不同命名空间中相同类型的 shared_ptr
Converting shared_ptr to shared_ptr of same type in different namespace
我有这个 Foo class
,其中包含 shared_ptr
到 Hotel 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
位于以下界面中名为 Rules
的 namespace
中:
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] 我该如何解决这个错误?因为两个参数是同一类型?两者都是指向酒店 class.
的智能指针
[2] 执行此操作的最佳做法是什么?我应该改为通过引用传递吗?
一定是在 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++不是选美比赛
我有这个 Foo class
,其中包含 shared_ptr
到 Hotel 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
位于以下界面中名为 Rules
的 namespace
中:
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] 我该如何解决这个错误?因为两个参数是同一类型?两者都是指向酒店 class.
的智能指针
[2] 执行此操作的最佳做法是什么?我应该改为通过引用传递吗?
一定是在 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++不是选美比赛