我为一些简单的模板化数学定义创建了这个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;
即使默认参数T
为float
,我也会收到错误:
'template<class T> struct Math' used without template parameters
如果我使用Math<>::PI
则可行。这是编译器错误还是强制要求<>
括号?
答案 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]