1

背景:私は、 FUSEと MTPという 2 つの異なるテクノロジで仮想ファイル構造を提供しています。どちらのフレームワークも異なるインターフェイスを必要とするため、これらのインターフェイスを提供する 2 つの基本クラスを作成しました。FUSEフレームワークはインターフェースIFuseFileのみを認識し、MTPフレームワークはIMTPFileインターフェースのみを認識します。これらの基本クラスには、派生クラスによって実装される純粋仮想メソッドがあります。

問題:単純に実装すると"request for member IsWriteable is ambiguous"、コンパイラによって a が表示されます (サンプル ソースを参照)。

解決策: 解決策を探したところ、ひし形のパターンしか見つかりませんでした。しかし、共通の純粋仮想メソッドしかなく、共通のクラスはありません。私にとっては、単純な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; }
}
4

1 に答える 1

1

に using 宣言がなく、参照またはポインターを介しPcComFileてアクセスしようとすると、コンパイラーはどちらが必要かを認識できません。違いがないことは問題ではありません。C++ の名前検索とあいまいさのルールは、両方の関数が抽象的であることを考慮していません。IsWriteablePcComFile

いずれかのメソッドの using 宣言はリクエストを明確にし、両方のメソッドが抽象的である間、どちらをプルするかは関係ありません。2 つの using 宣言を持つことは間違いなく冗長であり、実際には間違っているように見えます。コンパイルに失敗するか、再びあいまいにする必要があるようです。

于 2013-06-13T10:45:08.910 に答える