背景:私は、 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; }
}