我有这个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]如何修复此错误?既然两个参数都是同一类型?两者都是酒店类的聪明指针。
[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++不是一场选美比赛。