type - how to use class template c++



왜 클래스를 둘러싸는 클래스 템플릿을 전문화하지 않고 중첩 된 템플릿 멤버를 전문화 할 수 없습니까? (1)

다음은 Xeo의 예를 기반으로 한 아이디어입니다. 먼저 후보 기본 템플릿을 작성해 보겠습니다.

template <typename T> struct Foo
{
    template <typename U> struct Bar { /* ... */ };
    /* ... */
};

이제 내부 템플릿을 전문적으로 전문화한다고 가정 해보십시오.

template <typename T> template <> struct Foo<T>::Bar<bool> { /* ... */ }
// not actual C++!

하지만 Foo 전문화가 있다고 가정 해 봅시다.

template <> struct Foo<int>
{
    template <typename U> struct Bar { /* ... */ };
};
template <> struct Foo<char>
{
    template <typename U> U Bar() { }
};

이제 Foo<S>::Bar<bool> 을 사용하려면 어떻게해야할까요? S = char 일 때 우리는 내부 전문화를 사용할 수 없습니다. 왜냐하면 그것은 의미가 없기 때문입니다. 그러나 외부 템플릿의 모든 전문 분야에 대한 내부 전문화를 허용하지 않으면 Foo<float>::Bar<bool> 전문화되는 반면 Foo<float>::Bar<bool> Foo<int>::Bar<bool> 는 전문화되지 않습니다. 그래서 Foo<int> 가상의 내부 전문화가 적용되지는 않을지라도, Foo<int> 에는 적용되지 않습니다.

이것은 할 수없는 실질적인 기술적 인 이유가 아니라 예기치 않은 행동을하는 방법을 보여주는 그림입니다. 예를 들어, int 의 특수화는 나중에 작성되었으며 기존 코드는 내부 전문 분야에 의존한다고 가정합니다.

다음은 코드입니다.

template <typename T>
struct A
   {
   template <typename U>
   struct B;
   };
template <typename T> template <> // 0_o
struct A<T>::B<int> {};

나는 이것을 할 수 없다는 것을 알고 있지만 논리적으로 알고 싶습니다. 왜 클래스 템플릿을 둘러싸는 것을 전문으로하지 않고 중첩 된 템플릿 멤버를 전문화 할 수 없습니까?

나는 논리적 인 설명과 함께 어떤 도움을 주셔서 감사합니다 :)

편집하다 :

Andrei Alexandrescu의 대답 : "특별한 이유가 없습니다. 단지 언어의 규칙 일뿐입니다."





templates