【发布时间】:2015-12-26 11:57:33
【问题描述】:
我有这个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]如何解决此错误?由于两个参数是相同的类型?两者都是指向 Hotel 类的智能指针。
[2] 这样做的最佳做法是什么?我应该通过引用传递吗?
【问题讨论】:
-
您是否有两个相同的类,称为 Hotel,定义在不同的命名空间中?如果是这样,很难找到理由。
-
不,Hotel 类只定义一次,并且没有任何命名空间。只有 Rules 类有自己的命名空间。
-
哦。那么抱歉——我担心这个问题超出了我的想象。
-
编译器认为您在命名空间
Rules中确实有一个Hotel的定义,并且在全局命名空间中也有一个。意识到::Hotel和Rules::Hotel是两个截然不同的、完全不相关的类。您是否有机会从namespace Rules {}内部#include "Hotel.h"或类似的东西?如果是这样,请停止并停止。 -
除了@IgorTandetnik 的建议,你能检查一下你是否在命名空间
Rules中转发Hotel的声明
标签: c++ c++11 shared-ptr smart-pointers