2013-11-21 25 views
1

接听this question,我从GCC和锵得到一个惊人的错误:显式专精引发实例化?

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. 
}; 

为什么宣布一个明确的专业化要求隐式实例?这是否与范围解析运算符的所有用法属于同一类?

实例化模板找到一个成员对象我会明白的声明,但在成员类的情况下,可以检查该成员存在,是没有任何实例化一个类。 (您确实需要局部特殊化分辨率虽然)。

+0

'Inner'不是模板。我认为你在做什么将会类似于'template struct Foo {int a; }; template <> double Foo :: a;'。你不能一个一个地改变任意的成员。你必须专门化整个模板。 –

+0

@KerrekSB显式特化允许逐个更改成员。 – Potatoswatter

回答

1

在反思,这是一种固有的语言设计和明确专业化的怪癖缺陷。没有办法将明确的特殊化声明与成员声明进行匹配,而无需实例化类模板及其所有成员声明。

因为使用情况过于微小的担心,我不会提交缺陷报告,它不会咬别人不知道,因为当前实现诊断病情。