gpt4 book ai didi

c++ - 将 shared_ptr 转换为不同命名空间中相同类型的 shared_ptr

转载 作者:行者123 更新时间:2023-11-28 00:08:00 27 4
gpt4 key购买 nike

我有一个 Foo 类,其中包含一个 Hotel 类shared_ptr,以及一个 Rules 类(位于 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 位于以下接口(interface)中名为 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;

而不是在全局命名空间中引用 Hotel 类。

当在命名空间内对类进行非限定引用时,编译器首先检查该类是否存在于命名空间内,然后检查全局命名空间(这有点简化,还有一些其他规则,但除此之外点)。

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

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

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

为了强制它引用全局命名空间中的 Hotel 类。丑陋,但 C++ 不是选美比赛。

关于c++ - 将 shared_ptr 转换为不同命名空间中相同类型的 shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34467976/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com