1

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

问题:当直接实现它时,我得到一个"request for member IsWriteable is ambiguous"编译器(参见示例源)。

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

问题:由于我using BASE::method之前使用了 only for hidden 方法,我无法解释为什么这段代码可以解决我的问题。你能解释一下吗?这只是 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; }
}
4

1 回答 1

1

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

其中一种方法的 using 声明消除了请求的歧义,当这两种方法都是抽象的时,你拉入哪一个并不相关。有两个 using 声明绝对是多余的,而且在我看来实际上是错误的。看起来它应该无法编译或再次使其模棱两可。

于 2013-06-13T10:45:08.910 回答