2011-02-02 5 views
-1
template<class T> 
class base 
{ 
    class nestedClass 
    { 
     T pos; 
    }; 
    class derivedClass:public base<T>::nestedClass 
    { 
     void fun(){ 
     pos = pos +5; // error: pos is not declared in this scope 
     } 
    }; 

}; 
+2

구문 오류가 가득합니다. – sth

+0

죄송합니다. 저는 코드를 단순화했습니다. – Sean

+3

* 실제 * 코드를 복사하여 붙여주십시오. 당신은 분명히 많은 코드를 생략했으며, 무엇을 버렸는지 정확히 무엇이 잘못되었는지를 결정하는 데 중요 할 수 있습니다. 컴파일하거나 (* 컴파일해야한다고 생각하는) 최소한의 예제를 생성하고 문제를 보여줍니다. –

답변

3

C++ 03 절은 14.6/8], 일반적인 조회 규칙 (3.4.1, 3.4.2)을 사용할

말한다 비 의존적 이름의 경우. 템플릿 매개 변수에 종속 된 이름 조회는 실제 템플릿 인수가 알려질 때까지 연기됩니다 (14.6.2). 클래스 템플릿의 기본 클래스 템플릿 파라미터에 의존하는 경우

섹션 14.6.2/3은, 클래스 템플릿 또는 클래스 템플릿의 멤버의 정의에

말한다 기본 클래스 범위는 클래스 템플릿 또는 멤버의 정의 지점 또는 클래스 템플릿 또는 멤버의 인스턴스 생성 중에 정규화되지 않은 이름 조회 중에 검사되지 않습니다.

은 종속되지 않으므로 기본 클래스는 검사되지 않습니다.

두 가지 옵션이 있습니다.

  • 를 사용하여 완전히 회원 즉 base<T>::nestedClass::pos
  • 사용 this->pos의 수식 명입니다.
1

명시 적 기지로 참조 할 수있다 :: nestedClass이 :: pos가 당신이 범위에 POS를 가져하지 않는

+0

참조 http://stackoverflow.com/questions/4810272/c-inherited-template-classes-dont-have-access-to-the-base-class/4810438#4810438 –

+0

거짓말 쟁이라면 댓글과 사람들이 투표합니다. (그리고 아마도 당신의 다른 대답을 upvote) 닫습니다. –

1

[또는 사용하여 문을 사용]. this->pos += 5; 또는 using nestedclass::pos을 사용할 수 있습니다. 템플릿 정의에 사용되는 이름의 선언을 찾을 때

+0

'this.pos' ?? 이것은 Java가 아닙니다 –

+0

@Prasoon : true ... 당신의 의견이 나타 났을 때 고쳐주세요. –