这个问题与之前的问答相关,其中提到了 gcc 的错误报告(据说在 gcc 4.5.0 中已修复),并且涉及嵌套类模板的部分专业化的一些特性。
我的设置是我有一个Base
带有嵌套类模板的类,该类模板Inner
部分专门用于char
(使用虚拟参数技巧,因为在类中不允许显式指定)。
#include <type_traits>
#include <iostream>
#include <ios>
struct Base
{
// dummy template parameter...
template<class U, class _ = void> struct Inner: std::true_type {};
// ... to allow in-class partial specialization
template<class _> struct Inner<char, _>: std::false_type {};
};
我现在定义了一个Derived
我想进一步专门化的类Inner
,由于某些奇怪的原因不能在课堂上完成(即使它仍然是部分专业化)。
struct Derived
:
Base
{
// cannot partially specialize Inner inside Derived...
//template<class _>
//struct Inner<int, _>: std::false_type {};
};
// ... but specializing Derived::Inner at namespace scope, also specializes it for Base::Inner
template<class _> struct Derived::Inner<int, _>: std::false_type {};
第一个问题:为什么我必须部分专注Derived::Inner
于命名空间范围?
但最奇怪的是,当我调用Inner
from both Base
and的各种偏特化时,我只为之做Derived
的偏特化也适用于。int
Derived
Base
int main()
{
std::cout << std::boolalpha << Base::Inner<float>::value << "\n";
std::cout << std::boolalpha << Derived::Inner<float>::value << "\n";
std::cout << std::boolalpha << Base::Inner<char>::value << "\n";
std::cout << std::boolalpha << Derived::Inner<char>::value << "\n";
std::cout << std::boolalpha << Base::Inner<int>::value << "\n"; // huh???
std::cout << std::boolalpha << Derived::Inner<int>::value << "\n"; // OK
}
第二个问题:为什么Base::Inner<int>::value
等于false
,即使只是Derived::Inner<int>
部分特化?
使用 gcc 4.8.0 的在线示例。我正在专门寻找标准中解释这种行为的引用。