【问题标题】:Calling temporary object’s methods gives compiler error with older c library调用临时对象的方法会导致旧 c 库的编译器错误
【发布时间】: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(有问题)

标签: c++ linux methods temporary-objects


【解决方案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())
    

    呸。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多