【发布时间】:2013-11-09 00:42:14
【问题描述】:
在用作模板参数的类的成员函数中,我有一个包含以下代码的函数:
double x = /*Something operation returning double*/;
x /= CubeWidth; /*CubeWidth is a class member*/
cout << "Element after centering and normalization = " << x << endl;
cout << "and after adding 1 and truncating = " << x+1 << endl;
cout << "then static cast = " << (int) x+1 << endl;
这个函数的输出是
Element after centering and normalization = 1
and after adding 1 and truncating = 2
then static cast = 1
显然,最后一行应该给出答案 2。
如果我实例化完全相同的类而不使用它作为模板参数,我不会得到这个打印输出,而是我有正确的。
谁能告诉我为什么会这样?
【问题讨论】:
-
好问题为什么。不过,我知道如何解决这个问题 - 将您的表达式放在括号中。例如
((int)x+1)。我也将等待好的解释。编辑:如果这个解决方案不起作用,那么我 一定是 Daniel Frey 写的。 -
@j_random_hacker 不,
+的优先级高于<<,见here。 -
@j_random_hacker:
1 << 2 + 1真的是1 << 3例如8,而不是3。对于... << ( cond ) ? x : y << ...,优先级是有意义的,因为在这种情况下,表达式将使用y << ...,而不是y。 -
你说的不是截断,而是你和演员一起。
-
@DanielFrey:哎呀,
<<与+的关系是对的。但我对具有更高优先级的类型转换并因此被等效解析为((int) x) + 1是正确的,这可能不是 OP 想要做的,即使它没有产生明显的差异。您在回答中提到的舍入问题会导致可观察到的错误。
标签: c++ templates casting member-functions