我有Foo class
,其中包含shared_ptr
到Hotel 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] 这样做的最佳做法是什么?我应该通过引用传递吗?
答案 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 ++不是一场选美比赛。