2017-02-06 4 views
3

템플릿 매개 변수로 제공되는 클래스에 포함 된 템플릿 클래스를 인스턴스화하려고합니다. 이 예제를 통해 쉽게 이해할 수 있습니다 : 내가 주석 라인의 주석을 해제하면주어진 템플릿 매개 변수가있는 템플릿 내부의 변수 선언 템플릿 매개 변수

struct A { 
static constexpr int a = 42; 

class B { 
    int b; 
}; 

template<typename X> 
class C { 
    X c; 
}; 
}; 

template<typename U, typename T> 
class D { 
    int a = U::a; 

    using B = typename U::B; 
    B b; 

    //using C = typename U::C; 
    // C<T> c; 
    A::C<T> e; 
}; 


int main(void) { 
    D<A, int> d; 
    return 0; 
} 

이 컴파일러는 나에게 C 템플릿 아니다라는 오류가 있습니다. 이 변수를 인스턴스화하는 다른 방법을 시도했지만 작동하지 않았습니다. 나는 e 변수에 해당하는 것을 가지고 싶지만 U typename을 사용하고 싶습니다.

답변

5

C을 템플릿 유형으로 선언하지 않았 으면 C<T> c은 템플릿 유형으로 사용할 수 없기 때문에 오류가 발생합니다.

당신은 alias template (유형의 가족의 이름)입니다 원하는 것은 올바른 구문은 다음과 같습니다 다음

template <typename Z> 
using C = typename U::template C<Z>; 

D<A, int> d;

C<T> c; // same as U::template C<T>; Z is substituted with T 

, U = AT = int, C<T> 안에 DA::C<int>과 동일합니다.

LIVE

+0

은 이미 이것을 시도했고,이 오류가 도착했다 : 오류 : 예상을 ';'전에 '<'토큰 사용하여 C = 유형 이름 U : C Dam

+0

@Dam 어떤 컴파일러를? 나는 데모 [여기]를 시도했다 (http://rextester.com/YIOAX7967). – songyuanyao

+0

아니요, 이제 좋습니다. 감사 :) – Dam