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 ++不支持這種語法?
噢,謝謝。但爲什麼VS2012甚至不會提醒我這些? –
@AlexanderMihailov MSVC沒有正確實現兩階段名稱查找 - 它推遲*所有*名稱查找(以及其他很多解析)直到實例化時間(這就是爲什麼編譯模板代碼通常需要比GCC更長的原因)。在進行查找時,它不再需要'typename'。如果他們有代碼來檢查是否需要'typename',他們可能會首先使用它來遵循標準。 – Angew