C++ 为什么可以';我是否先专门化嵌套模板成员而不专门化封闭类模板?

C++ 为什么可以';我是否先专门化嵌套模板成员而不专门化封闭类模板?,c++,templates,C++,Templates,代码如下: template <typename T> struct A { template <typename U> struct B; }; template <typename T> template <> // 0_o struct A<T>::B<int> {}; 模板 结构A { 模板 结构B; }; 模板//0\u o 结构A::B{}; 我知道我不能这样做,但我更感兴趣的是从逻辑

代码如下:

template <typename T>
struct A
   {
   template <typename U>
   struct B;
   };
template <typename T> template <> // 0_o
struct A<T>::B<int> {};
模板
结构A
{
模板
结构B;
};
模板//0\u o
结构A::B{};
我知道我不能这样做,但我更感兴趣的是从逻辑上知道为什么我不能在不首先专门化封闭类模板的情况下专门化嵌套模板成员

我非常感谢您在逻辑解释方面的帮助:)

编辑:
Andrei Alexandrescu的回答是:“没有什么特别的原因——这只是一个语言规则。”

这里有一个基于Xeo示例的想法:首先,让我们来看看我们的候选主模板:

template <typename T> struct Foo
{
    template <typename U> struct Bar { /* ... */ };
    /* ... */
};
现在,如果要使用
Foo::Bar
,该怎么办?当
S=char
时,我们不能使用内部专门化,因为它没有意义。但是如果我们不允许外部模板的所有专门化的内部专门化,那么
Foo::Bar
不是专门化的,而
Foo::Bar
将专门化。因此,我们假设的内部专门化不适用于
Foo
,尽管人们可能已经预料到它应该适用


这并不是一个真正的技术原因,它不能做到,但只是一个例子,它会有非常意想不到的行为。(例如,假设
int
的专门化是在以后编写的,而现有代码依赖于内部专门化。)

可能与此重复@阿杰这个复制品怎么样?0_o,我正在寻找一个解释如果你必须在外部专业化和内部专业化之间做出决定(例如,假设两者都是部分专业化的,分别的),可能会有歧义看,看我对这个问题的评论,似乎只有明确的专业化是不允许的,不管出于什么原因。您在对我的回答的评论中确实建议,专门化只适用于主模板。
template <typename T> template <> struct Foo<T>::Bar<bool> { /* ... */ }
// not actual C++!
template <> struct Foo<int>
{
    template <typename U> struct Bar { /* ... */ };
};
template <> struct Foo<char>
{
    template <typename U> U Bar() { }
};