template<int x> struct A {
        template<int y> struct B {};.
        template<int y, int unused> struct C {};
    };

    template<int x> template<>
    struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized

    template<int x> template<int unused>
    struct A<x>::C<x, unused> {}; // ok

那么,如果外部类也不是专门化的,那么为什么不允许对内部嵌套类(或函数)进行显式专门化呢?奇怪的是,如果我只是通过简单地添加一个虚拟模板参数来部分地专门化内部类,我就可以解决这个问题。使事情变得更丑陋和更复杂,但它有效。

我将完全特化视为部分特化的子集 - 特别是因为您可以通过添加虚拟参数将每个完全特化表示为部分特化。因此,对部分特化和完全特化之间的这种消歧对我来说并没有什么意义。

不幸的是,comp.std.c++ 中没有人敢回答,所以我悬赏再次将其放在这里。

注意:对于一组外部类的内部类的递归模板,我需要此功能,并且内部参数的特化确实取决于外部模板参数。

最佳答案

我对为什么会发生这种情况的猜测:完整的特化不再是“模板类/函数”,它们是“真正的”类/方法,并且拥有真正的(链接器可见的)符号。但是对于部分专业模板中的完全专业模板,这不是真的。
可能做出这个决定只是为了简化编译器编写者的生活(并在此过程中使编码人员的生活更加艰难:P)。

关于c++ - 为什么允许嵌套类模板的部分特化,而不允许完全特化?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25533037/

10-11 22:38
查看更多