当我包含标准矢量库时,我看到一些非常奇怪的行为。谁能告诉我导致这些失败的原因是什么?我踩到了谁的脚趾,是否有一个我应该注意的这个bug的一般情况?
我正在使用ROOT C ++解释器。从命令行解释器接口或编译代码,
$ root -l
root [0] #include <vector>
root [1] float max = -1.15;
root [2] if (max < -1 && max > -1.2) max = 2;
Error: Variable name has bad character 'max<-1&&max>-1207' (tmpfile):1:
Error: Symbol max<-1&&max>-1207 is not defined in current scope (tmpfile):1:
Error: Variable name has bad character 'max<-1&&max>-1' (tmpfile):1:
Error: Symbol max is not defined in current scope (tmpfile):1:
Error: non class,struct,union object $max<-1&&max>-1 used with . or -> (tmpfile):1:
*** Interpreter error recovered ***
root [3] max
(float)(-1.14999997615814209e+00)
然后,如果我添加一些不能做任何事情的括号:
root [4] if ((max < -1) && (max > -1.2)) max = 2;
root [5] max
(float)2.00000000000000000e+00
root [6] .qqqqqqqqqqqq
如果我只是正常退出root,root seg-faults。如果我不包含它,它应该按原样运行:
[abarker@cmslpc29 macro]$ r
root [0] float max = -1.15;
root [1] if (max < -1 && max > -1.2) max = 2;
root [2] max
(float)2.00000000000000000e+00
此外,如果我将变量名称更改为“max”以外的其他名称,问题就会消失。
答案 0 :(得分:1)
max由&lt;静静地定义矢量&gt;。
$ root -l
root [0] max
Error: Symbol max is not defined in current scope (tmpfile):1:
*** Interpreter error recovered ***
root [1] max(1,2)
Error: Function max(1,2) is not defined in current scope (tmpfile):1:
*** Interpreter error recovered ***
root [2] #include <vector>
root [3] max
(const void*)0x2b6758507c37
root [4] max(2,3)
(const int)3
因此,解释器中的一些错误是绊倒重载的名称并搞乱范围规则。
答案 1 :(得分:0)
看起来翻译人员将max
视为std::max
,这是一个模板。这就是为什么它试图将<
和>
中的文本视为模板参数。这高度不合格; max
在名称空间std
中定义,不与名为max
的变量发生冲突。