2014-03-05 295 views
0

我想要建立一個具有可配置類型和差異類型模板參數的類。第一個解決方案在VS2012Nov和g ++ 4.7.2編譯罰款:默認模板參數

template <typename T, 
    typename DT = decltype(T()-T())> 
class A { }; 

但是,當我隱藏decltype(T()-T())額外的模板,VS仍然編譯它,但G ++不。

template < typename T > 
struct Delta { 
    typedef decltype(T() - T()) Value; 
}; 

template <typename T, 
    typename DT = Delta<T>::Value > 
class A { }; 

爲什麼g ++不支持這種語法?

回答

1

你錯過了typename關鍵字,以告訴從屬名稱是一種編譯器:

template < typename T > 
struct Delta { 
    typedef decltype(T() - T()) Value; 
}; 

template <typename T, 
    typename DT = typename Delta<T>::Value > 
class A { }; 

Live example

欲瞭解更多信息,請參閱Where and why do I have to put the 「template」 and 「typename」 keywords?

+0

噢,謝謝。但爲什麼VS2012甚至不會提醒我這些? –

+0

@AlexanderMihailov MSVC沒有正確實現兩階段名稱查找 - 它推遲*所有*名稱查找(以及其他很多解析)直到實例化時間(這就是爲什麼編譯模板代碼通常需要比GCC更長的原因)。在進行查找時,它不再需要'typename'。如果他們有代碼來檢查是否需要'typename',他們可能會首先使用它來遵循標準。 – Angew