gpt4 book ai didi

c++ - 为什么 "using MyBase::myMethod"解决 "request for member myMethod is ambiguous"? (不是菱形图案!!!)

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:30 26 4
gpt4 key购买 nike

背景:我提供了一种基于两种不同技术的虚拟文件结构:FUSE和中期计划。由于这两个框架需要不同的接口(interface),我创建了两个为这些接口(interface)提供服务的基类。 FUSE famework 只知道IFuseFile 接口(interface),而MTP 框架只知道IMTPFile 接口(interface)。这些基类具有纯虚方法,由派生类实现。

问题:当直接实现它时,编译器(参见示例源代码)得到了一个“对成员 IsWriteable 的请求不明确”

解决方案: 在寻找解决方案时,我只找到了菱形图案。但是我只有普通的纯虚方法,没有普通的类。对我来说,一个简单的 using BASE::method 就可以了。

问题:因为我以前只对隐藏方法使用using BASE::method,所以我无法解释为什么这段代码解决了我的问题。你能解释一下吗?这只是 GCC 错误/功能吗?

示例:

class IFuseFile
{
virtual bool IsWriteable() const = 0;
public:
int HandleReadRequest( struct fuse_data* pData )
{
if( !IsWriteable() ) return -EACCESS;
...
}
}
class IMTPFile
{
virtual bool IsWriteable() const = 0;
public:
int ReadData( const char* pBuffer, int iSize )
{
if( !IsWriteable() ) return -1;
...
}
}
class PcComFile : public IFuseFile, public IMTPFile
{
using IFuseFile::IsWriteable;
using IMTPFile::IsWriteable;
}
class LogFile : public PcComFile
{
bool IsWriteable() const override { return true; }
}
class StatusFile : public PcComFile
{
bool IsWriteable() const override { return true; }
}

最佳答案

如果您在 PcComFile 中没有 using 声明,并且您尝试通过 PcComFile 引用或指针访问 IsWriteable,则编译器不知道你想要哪一个。没关系没关系; C++ 的名称查找和歧义规则没有考虑到这两个函数都是抽象的。

其中一种方法的 using 声明消除了请求的歧义,并且在两种方法都是抽象的情况下,您使用哪一种方法无关紧要。有两个 using 声明绝对是多余的,而且在我看来实际上是错误的。看起来它应该无法编译或再次使其不明确。

关于c++ - 为什么 "using MyBase::myMethod"解决 "request for member myMethod is ambiguous"? (不是菱形图案!!!),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083340/

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