为什么有:
template<double&& value>
struct X
{
};
这不起作用:
X<1> not_ok;
但这有效:
X<1.0> ok;
行为不应该有正交性吗?如果我可以将int作为arg传递给fnc,为什么我不能用&lt;&gt; (模板)?有没有办法绕过这个(我需要这个来制作一个模板(而不是两个不同的名字),这将允许我采取双&amp;&amp;或int&amp;&amp;)?我试图将类转换ctor从int传递给这个类,但这会导致VS编译器崩溃。我不知道该怎么办。我被卡住了。 我也尝试过专业化:
template<class T>
struct X;
template<>
struct X<double&&>
{
};
template<>
struct X<int&&>
{
};
但惊喜不起作用。为什么?我有一个主要模板,然后我想专门研究某些类型,为什么它不起作用?
答案 0 :(得分:2)
根据N3126 (the final draft)(14.1 / 4):
非类型模板参数必须 具有以下之一(可选 cv-quali fi ed)类型:
- 整数或枚举类型,
- 指向对象或指向函数的指针,
- 左值对象的引用或左值对函数的引用,(强调我的)
- 指向会员的指针。
因此,正如您所看到的,rvalue引用根本不允许作为模板参数。如果您想克服模板参数不能为double
的限制,为什么不将加载因子表示为理性:
my_vector<7, 12>
...加载因子至少为7/12。
顺便说一句,你也可以将加载因子存储为常量(或成员),这可能会减少代码膨胀,并且性能不会太差。
你发布的第二个问题(double&&
的专业化)是一个完全不同的东西,支持并适用于我(使用g ++ - 4.5):
template<class T>
struct X;
template<>
struct X<double&&>
{
};
template<>
struct X<int&&>
{
X();
};
X<int&&> a;
/usr/bin/ld: /usr/lib/debug/usr/lib/crt1.o(.debug_info): relocation 0 has invalid symbol index 12
...
/usr/lib/gcc/i486-linux-gnu/4.5.1/../../../../lib/crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
/home/jirka/tmp/ccqJkazZ.o: In function `__static_initialization_and_destruction_0(int, int)':
:(.text+0x1d): undefined reference to `X<int&&>::X()'
答案 1 :(得分:1)
我不确定你是否可以将float / double作为模板参数传递,它应该只是一个整数。 此外,浮点数不会按原样存储,因此1.0实际上不是1.0,但可能是0.999999999999。因此,在执行比较时不应使用浮点数。