배경 : 나는 두 가지 기술, 즉 FUSE과 MTP를 통해 가상 파일 구조를 제공합니다. 두 프레임 워크는 서로 다른 인터페이스가 필요하기 때문에 이러한 인터페이스를 제공하는 두 개의 기본 클래스를 만들었습니다. FUSE 설계는 IFuseFile
인터페이스 만 알고 있으며 MTP 프레임 워크는 IMTPFile
인터페이스 만 알고 있습니다. 이러한 기본 클래스는 순수 가상 메서드를 가지며 파생 클래스에서 구현됩니다."myBase :: myMethod를 사용하여"myMethod 멤버에 대한 요청이 모호한 문제를 해결하는 이유는 무엇입니까? (다이아몬드 패턴이 아닙니다 !!!)
문제점 : 직접 구현할 때 컴파일러에서 "request for member IsWriteable is ambiguous"
이 표시됩니다 (예제 소스 참조).
해결책 : 솔루션을 검색 할 때 다이아몬드 패턴 만 발견했습니다. 하지만 공통된 순수 가상 메서드 만 있고 일반적인 클래스는 없습니다. 나를 위해 간단한 using BASE::method
트릭을 않습니다.
질문 : 이전에 숨겨진 방법으로 만 using BASE::method
을 사용했기 때문에이 코드가 내 문제를 해결하는 이유를 설명 할 수 없습니다. 설명해 주시겠습니까? 이것은 GCC 버그/기능입니까?
예 : 당신이 PcComFile
에 사용 선언을하지 않고, 당신이 PcComFile
참조 또는 포인터를 통해 IsWriteable
에 액세스하려고하면
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; }
}
당신은 정말로 옳습니다. 현재 컴파일러 (GCC 4.7.2)는 (동일한 메소드 이름을 사용하는) 선언을 사용하는 두 개를 허용하지만 GCC 4.3.3은이 코드를 거부하고 선언을 사용하여 두 개 중 하나만 수락합니다. – Charly