【发布时间】:2013-12-05 06:55:55
【问题描述】:
回答 this question,我从 GCC 和 Clang 收到了一个令人惊讶的错误:
template< typename = void >
struct Outer_temp
{
struct Inner;
Inner myinner;
};
template<>
struct Outer_temp<void>::Inner // Error: specialization of Outer_temp
{ // with member myinner of incomplete type.
};
为什么声明显式特化需要隐式实例化?这是否与范围解析运算符的所有用途属于同一类别?
实例化模板以查找成员对象的声明我会理解,但是在成员类的情况下,您可以检查该成员是否存在并且是一个类而无需实例化任何东西。 (不过,您确实需要部分专业化解决方案。)
【问题讨论】:
-
Inner不是模板。我认为您正在做的事情类似于template <typename> struct Foo { int a; }; template <> double Foo<void>::a;。您不能一一更改任意成员。您必须专门化整个模板。 -
@KerrekSB 显式专业化允许一个一个地改变成员。
标签: c++ templates template-specialization