【问题标题】:Explicit specialization incurs instantiation?显式专业化会导致实例化?
【发布时间】: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 &lt;typename&gt; struct Foo { int a; }; template &lt;&gt; double Foo&lt;void&gt;::a;。您不能一一更改任意成员。您必须专门化整个模板。
  • @KerrekSB 显式专业化允许一个一个地改变成员。

标签: c++ templates template-specialization


【解决方案1】:

仔细想想,这是语言设计固有的缺陷和显式专业化的怪癖。如果不实例化类模板及其所有成员声明,​​就无法将显式特化声明与成员声明相匹配。

我不会提交缺陷报告,因为用例太小而无需担心,而且它不会因为当前的实现诊断条件而咬人不知情的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多