默认模板参数

时间:2014-03-05 09:08:54

标签: c++ templates

我想构建一个具有可配置类型和差异类型模板参数的类。第一个解决方案在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 个答案:

答案 0 :(得分: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?