2015-04-17 195 views
24

如果我有下面的代碼:實例化模板

template <typename T = int> 
struct mystruct { 
    using doublestruct = mystruct<double>; 
} 

mystruct<>::doublestruct obj; 

這是否實例化mystruct<int>模板呢?或者只有mystruct<double>被實例化?

+0

您沒有在模板中使用「T」類型。你想用這樣的模板實現什麼? –

+3

@MykhayloKopytonenko:這是一個人爲的例子。實際上,它是一個很好的測試用例。他詢問一個模板是否僅在命名時指定了一個[非依賴]成員類型的實例。 –

回答

18

是的,它將不得不實例化mystruct<int>以訪問其成員並確定doublestruct的含義。您可以使用static_assert來測試:

#include <type_traits> 

template <typename T = int> 
struct mystruct { 
    static_assert(!std::is_same<T,int>::value, ""); 
    using doublestruct = mystruct<double>; 
}; 

mystruct<>::doublestruct obj;  // assertion fails for T==int 
mystruct<char>::doublestruct obj; // OK, not instantiated for int 
+1

mebe在這個演示中使用了「double」以外的東西;有點混淆 –

+0

@LingningRacisinObrit:好的,我想。 –

16

是的,它必須實例化; doublestruct是實例化的成員,因此,如果您沒有實例化,則沒有doublestruct

[C++11: 14.7.1]:除非類模板特已經明確實例化(14.7.2)或明確專門(14.7.3),當專業化,需要一個completely-上下文引用的類模板專業化隱式實例定義的對象類型或類類型的完整性是否影響程序的語義。 [..]

特別是,考慮到可以不包含一個構件doublestruct,或可含有一個不是一種類型的mystruct特殊化的潛在影響。