2012-11-15 4 views
11

'종속 이름'이 기본적으로 컴파일러에 표시되지 않는다는 사실을 알고 있습니다. 그러나 다른 질문 (here, here 및 궁극적으로는 on the C++ faq)에 대한 답변에서 using 선언이 도움이 될 것이라고 들었습니다.템플릿 기본 클래스 typedef 멤버 보이지 않음

그래서 시도했습니다. 기본의 멤버를 사용하여

// regardless of the fact that members are exposed... 
template<typename T> 
struct TBase { 
    typedef T MemberType; 
    MemberType baseMember; 
    MemberType baseFunction() { return MemberType(); } 
}; 

그리고 파생 클래스 :

템플릿 기본 클래스는

template<typename T> 
struct TDerived : public TBase<T> { 
    // http://www.parashift.com/c++-faq-lite/nondependent-name-lookup-members.html 
    // tells us to use a `using` declaration. 
    using typename TBase<T>::MemberType; 
    using TBase<T>::baseFunction; 
    using TBase<T>::baseMember; 

    void useBaseFunction() { 
     // this goes allright. 
     baseFunction(); 
     ++baseMember; 

     // but here, the compiler doesn't want to help... 
     MemberType t; //error: expected `;' before ‘t’ 
    } 
}; 

나는 this out on ideone을 시도했다. gcc-4.3.3 및 gcc-4.5.1이 있습니다.

이 예상되는 동작입니까? 부모 템플릿 클래스의 멤버 typedef에 액세스하기위한 '종속 이름'법을 어떻게 해결할 수 있습니까?

using MemberType = typename TBase<T>::MemberType; // new type alias syntax 

또는

typedef typename TBase<T>::MemberType MemberType; // old type alias syntax 

구문 using Base::member; 만 범위에 비 형 멤버의 선언을 가져다 사용할 수 있습니다

답변

18

당신은 아마하고 싶어.


또한 이들 중 어느 것도 실제로 필요하지 않습니다, 당신은 (this-> 또는 염기와 비 유형, 기본과 유형) 각각의 사용을받을 수 있으며, 그 기호가 따라 할 것입니다주의.

+0

이 문제가 해결되었습니다. 당신의 대답에 걸쳐 왔고 파생 된 클래스에서 "this->"를 사용하는 것이 매력처럼 작용했습니다. 감사. –

+0

실제로, 구문을 사용할 수 있지만 typename TBase를 사용하는 typename이 필요합니다. :: MemberType;이 (가) 나를 위해 효과가있는 것 같습니다. – RiaD