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