4
以下代碼使用g ++編譯,但無法使用clang進行編譯。類模板中的Typedef評估
struct X;
template <typename T>
struct Traits
{
typedef typename Traits<T>::Container Container;
};
template <>
struct Traits<X>
{
typedef std::vector<X *> Container;
};
int main()
{
Traits<X>::Container container;
return EXIT_SUCCESS;
}
鐺錯誤消息:
main.cpp:9:30: error: no type named 'Container' in 'Traits<T>'
編譯器應該不會與實際類型替換模板參數評估的typedef?哪個編譯器是正確的?
鐺:http://coliru.stacked-crooked.com/a/fef7725827074e4f
GCC:http://coliru.stacked-crooked.com/a/79e17031fcabcd83
'的typedef typename的性狀 ::集裝箱貨櫃;'是一個無限遞歸的typedef ... –
cdhowie
我猜想,因爲性狀是一個從屬名稱,應該實例化過程中評估。但我無法用任何相關的標準報價來證明它。 –
SergeyA
@cdhowie,我不確定它是否會,甚至會這樣,編譯器可能會抱怨最大模板深度,而不是缺少類型? – SergeyA