包含<vector> </vector>时的奇怪行为

时间:2013-06-16 04:02:13

标签: c++ stdvector

当我包含标准矢量库时,我看到一些非常奇怪的行为。谁能告诉我导致这些失败的原因是什么?我踩到了谁的脚趾,是否有一个我应该注意的这个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”以外的其他名称,问题就会消失。

2 个答案:

答案 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的变量发生冲突。