1

当我包含标准向量库时,我看到了一些非常奇怪的行为。谁能告诉我是什么导致了这些失败?我踩到了谁的脚趾,我应该注意这个错误的一般情况吗?

我正在使用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”以外的名称,问题就会消失。

4

2 回答 2

1

max 由 <vector> 悄悄定义。

$ 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

所以解释器中的一些错误会导致重载名称和范围规则混乱。

于 2013-06-16T04:51:38.240 回答
0

看起来解释器看到max的是std::max,这是一个模板。这就是为什么它试图将内部的文本<视为>模板参数。这是高度不合格的;max是在命名空间中定义的std,因此不会命名的变量发生冲突max

于 2013-06-16T10:16:32.383 回答