gpt4 book ai didi

c++ - 为什么不先专门化封闭类模板就不能专门化嵌套模板成员?

转载 作者:IT老高 更新时间:2023-10-28 21:34:10 24 4
gpt4 key购买 nike

代码如下:

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

我知道我不能这样做,但我更想知道逻辑为什么我不能在不先专门化封闭类模板的情况下专门化嵌套模板成员?

感谢任何关于逻辑解释的帮助:)

编辑:

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

最佳答案

这是基于 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<int>::Bar<bool>不是专门的,而 Foo<float>::Bar<bool> 特化。所以我们假设的内部特化不适用于 Foo<int> ,尽管人们可能已经预料到它应该这样做。

这并不是无法完成的真正技术原因,而只是说明它会如何产生非常意外的行为。 (例如,假设 int 的特化是后来编写的,而现有代码依赖于内部特化。)

关于c++ - 为什么不先专门化封闭类模板就不能专门化嵌套模板成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com