2014-03-05 183 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