2016-07-28 2 views
3

템플릿 상속을 사용하려고하면 이상한 오류가 발생합니다. 이 내 코드입니다 :템플릿 상속 및 기본 멤버 변수

template <class T> class A { 
public: 
    int a {2}; 
    A(){}; 
}; 

template <class T> class B : public A<T> { 
    public: 
    B(): A<T>() {}; 
    void test(){ std::cout << "testing... " << a << std::endl; }; 
}; 

그리고 이것은 오류입니다 :

error: use of undeclared identifier 'a'; did you mean 'std::uniform_int_distribution<long>::a'? 
    void test(){ std::cout << "testing... " << a << std::endl; } 

그리고 경우에는 영향을 줄 수있는 뭔가 내가이 플래그를 사용

-Wall -g -std=c++11 

정말하지 않습니다를 템플릿이없는 순수 클래스와 동일한 코드가 제대로 작동하기 때문에 잘못된 점을 알아야합니다.

+1

'무효 시험() {표준 : : cout과 << "테스트 ..."<< A :: << std :: endl; }; ' – Rerito

답변

4

I really don't know what is wrong since the same code as pure classes without templating works fine.

이 기본 클래스 (클래스 템플릿 A)는 nondependent 기본 클래스가 아니기 때문에, 그 형태는 템플릿 인수를 알지 못하고 판단 할 수 없다. a은 비 종속적 이름입니다. 비 종속적 인 이름은 종속 기본 클래스에서 조회되지 않습니다.

코드를 수정하려면 a이라는 이름을 만들 수 있습니다. 종속 이름은 인스턴스 생성 당시에 만 조회 할 수 있습니다. 이때 정확한 기본 전문화 영역을 탐색하고 알려야합니다.

당신 수

void test() { std::cout << "testing... " << this->a << std::endl; }; 

또는

void test() { std::cout << "testing... " << A<T>::a << std::endl; }; 

또는

void test() { 
    using A<T>::a; 
    std::cout << "testing... " << a << std::endl; 
}; 
+0

답변 해 주셔서 감사합니다. 그것은 지금 의미가있다 :) –