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;
}
어떤 행동 양식이 표준을 따르고 있습니까?
이것은 [적극적인 핵심 이슈] (http://wg21.link/cwg1286)입니다. –
@ t.c. 템플릿 인스턴스가 아닌 템플릿과 일치하는 다른 모양입니까? – Yakk
@Yakk 동일합니다. 이 문제는 'Foo'부분 전문화에서'Resolution , int> :: type' (이름이 템플릿 임에도 불구하고)을 'First'에 매치하는 것과 관련이 있습니다. –