2016-09-12 16 views
10

템플릿 별칭과 템플릿 전문화 조합을 사용하여 템플릿 매개 변수의 기본 템플릿을 결정하고 싶습니다. 다음 코드는 gcc 4.8, 6.2.1에서는 제대로 컴파일되지만 3.5, 3.8에서는 컴파일되지 않습니다.템플릿 별칭, 템플릿 전문화 및 템플릿 템플릿 매개 변수

#include <iostream> 

template <typename T> struct First {}; 

template <typename T> struct Second {}; 

template <template <typename> class F, typename T> struct Foo {}; 

template <typename T> struct Foo<First, T> 
{ 
    void f() { std::cout << __PRETTY_FUNCTION__ << std::endl; } 
}; 

template <typename T> struct Foo<Second, T> 
{ 
    void f() { std::cout << __PRETTY_FUNCTION__ << std::endl; } 
}; 

template <typename F, typename T> struct Resolution {}; 

template <typename T> struct Resolution<First<T>, T> 
{ 
    template <typename P> using type = First<P>; 
}; 

template <typename T> struct Resolution<Second<T>, T> 
{ 
    template <typename P> using type = Second<P>; 
}; 

int main() 
{ 
    Foo<Resolution<First<int>, int>::type, float> my_foo; 
    my_foo.f(); // main.cpp:34:12: error: no member named 'f' in 'Foo<Resolution<First<int>, int>::type, float>' 

    return 0; 
} 

어떤 행동 양식이 표준을 따르고 있습니까?

+6

이것은 [적극적인 핵심 이슈] (http://wg21.link/cwg1286)입니다. –

+0

@ t.c. 템플릿 인스턴스가 아닌 템플릿과 일치하는 다른 모양입니까? – Yakk

+0

@Yakk 동일합니다. 이 문제는 'Foo '부분 전문화에서'Resolution , int> :: type' (이름이 템플릿 임에도 불구하고)을 'First'에 매치하는 것과 관련이 있습니다. –

답변