2013-06-13 5 views
1

배경 : 나는 두 가지 기술, 즉 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; } 
} 

답변

1

, 컴파일러가 알지 않는 한 당신을 필요. 아무런 차이가 없다는 것은 중요하지 않습니다. C++의 이름 조회 및 모호성 규칙은 두 함수가 추상이라는 것을 고려하지 않습니다.

하나의 메소드에 대한 선언을 사용하면 요청이 명확 해지며 두 메소드가 모두 추상 메소드 인 동안 어느 메소드를 가져 왔는지는 관련이 없습니다. 선언을 사용하는 두 가지는 분명히 중복되어 실제로 나에게 잘못되었습니다. 컴파일에 실패하거나 다시 모호한 것으로 보입니다.

+0

당신은 정말로 옳습니다. 현재 컴파일러 (GCC 4.7.2)는 (동일한 메소드 이름을 사용하는) 선언을 사용하는 두 개를 허용하지만 GCC 4.3.3은이 코드를 거부하고 선언을 사용하여 두 개 중 하나만 수락합니다. – Charly