调用临时对象的方法会导致旧 c 库的编译器错误
Posted
技术标签:
【中文标题】调用临时对象的方法会导致旧 c 库的编译器错误【英文标题】:Calling temporary object’s methods gives compiler error with older c library 【发布时间】:2010-02-19 13:57:32 【问题描述】:当我从带有 glibc-2.5-25 (suse 10.2) 的计算机移植到带有 glibc-2.3.2-6 (suse 8.2) 的计算机时,我的代码出现了一个奇怪的问题。我对临时对象使用了几个方法调用,但它们在旧机器上不起作用。
class A
public:
A(int n)
void method()
;
int main()
A(10).method(); //here the compiler gives parse error before .
A a(10);
a.method(); //this works fine
这真的会因为旧的 libc 版本而发生吗?或者它可能是我的 IDE 中的一个设置(编译器设置)?
【问题讨论】:
glibc 是一个库 - 这是一个编译问题。 你使用的是什么编译器版本? 是的,你是对的,gcc版本如下:新平台上的gcc-4.1.3-29旧平台上的gcc-3.3-23(有问题) 【参考方案1】:为什么 libc 版本会影响解析错误? g++ 版本会更有用。
gcc 在 3.4 版左右更改了它的解析器,并在当时解决了许多在旧的 yacc 解析器中不容易修复的解析问题。这可以解释你所看到的。
【讨论】:
【参考方案2】:这似乎是一个编译器错误:http://gcc.gnu.org/ml/gcc-bugs/1998-10/msg00178.html(旧版本,相同错误)。具有相同语义的解决方法如下:
#define TEMP(T, x, y) T _temporary(x); _temporary.y;
A(10).method(); // is:
TEMP(A, 10, method())
呸。
【讨论】:
以上是关于调用临时对象的方法会导致旧 c 库的编译器错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用它们时,同一调用中的两个泛型方法是不是会导致编译错误?