2013-11-21 43 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

在反思,這是一種固有的語言設計和明確專業化的怪癖缺陷。沒有辦法將明確的特殊化聲明與成員聲明進行匹配,而無需實例化類模板及其所有成員聲明。

因爲使用情況過於微小的擔心,我不會提交缺陷報告,它不會咬別人不知道,因爲當前實現診斷病情。