C ++:默认模板参数仅在使用"<>"时推断出来。

时间:2015-04-25 12:22:06

标签: c++ templates c++11

我为一些简单的模板化数学定义创建了这个struct

template<class T = float> struct Math{
    static constexpr T PI = T(3.14159265359);
    static constexpr T E = T(2.718281828459);
    static constexpr T INF = std::numeric_limits<T>::infinity();
};

我想像这样使用它:

float pi = Math::PI;

即使默认参数Tfloat,我也会收到错误:

'template<class T> struct Math' used without template parameters

如果我使用Math<>::PI则可行。这是编译器错误还是强制要求<>括号?

3 个答案:

答案 0 :(得分:1)

<>括号是强制性的(请参阅here)。

但是这里还有其他一些选择:

使用typedef

typedef Math<> MyDefaultMath
// or
typedef Math<float> MyFloatMath

或只是删除模板

struct Math
{
    static constexpr float PI = 3.14159265359f;
    // ...

答案 1 :(得分:1)

  

这是编译器错误还是&lt;&gt;括号必须吗?

不,这不是他们必须的错误。

但是,你可能想多想一想。如果有人使用Math<int>怎么办?例如,std::numeric_limits::infinity的文档说明如下:

  

仅在std :: numeric_limits :: has_infinity == true

时才有意义

答案 2 :(得分:1)

空括号是强制性的,并且是标准所要求的。来自[temp.arg],强调我的:

  

使用模板参数包或默认模板参数时,可以使用模板参数列表   空。在这种情况下,空<>括号仍将被用作作为模板参数列表。 [例如:

template<class T = char> class String;
String<>* p; // OK: String<char>
String* q; // syntax error

template<class ... Elements> class Tuple;
Tuple<>* t; // OK: Elements is empty
Tuple* u; // syntax error
     

-end example]