Почему & quot; использует MyBase :: myMethod & quot; решить «запрос на членство myMethod является неоднозначным» ? (НЕ ромбовидный !!!)

Фон: Я предлагаю виртуальную файловую структуру на основе двух разных технологий: FUSE и MTP. Поскольку обеим фреймворкам нужны разные интерфейсы, я создал два базовых класса, которые обслуживают эти интерфейсы. FUSE Famework знает только IFuseFile интерфейс, в то время как структура MTP знает только IMTPFile интерфейс. Эти базовые классы имеют чисто виртуальные методы, которые реализуются производным классом.

Эта проблема: При реализации прямо вперед я получаю "request for member IsWriteable is ambiguous" компилятором (см. пример источника).

Решение: При поиске решения я нашел только ромбовидный узор. Но у меня есть только общие чисто виртуальные методы, нет общих классов. Для меня простой 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; }
}

1

Решение

Если у вас нет объявления об использовании в PcComFileи вы пытаетесь получить доступ IsWriteable через PcComFile ссылка или указатель, компилятор не знает, какой вы хотите. Неважно, что это не имеет значения; Правила поиска имен и неоднозначности в C ++ не учитывают абстрактность обеих функций.

Объявление использования для одного из методов устраняет неоднозначность запроса, и неважно, какой вы используете, когда оба метода являются абстрактными. Наличие двух объявлений об использовании определенно является излишним и на самом деле выглядит неправильно для меня. Похоже, что он не сможет скомпилировать или сделать его неоднозначным снова.

1

Другие решения

Других решений пока нет …