gcc中的C ++错误和成功VS.

时间:2013-08-05 14:54:31

标签: c++ linux visual-c++ gcc

以下代码无法在gcc 4.7中编译,但在VS(9,10,11)中编译也遵循gcc输出。

#include <iostream>

using namespace std;

class A
{
public:
    virtual void M() = 0;
};

class B
{
public:
    inline B& operator<<(A &value)
    {
        value.M();
        return *this;
    }
};

class C: public A
{
public:
    virtual void M()
    {
        cout << "Hello World" << endl; 
    }
};

int main()
{
    B b;
    C c;

    b << c;   //line not erro
    b << C(); //Line with error

    return 0;
}

gcc log

  

$ g ++ main.cpp -o test main.cpp:在函数'int main()'中:
  main.cpp:36:12:错误:不匹配'operator&lt;&lt;'在'b&lt;&lt; C()'
  main.cpp:36:12:注意:候选人是:main.cpp:14:15:注意:B&amp;
  B :: operator&lt;&lt;(A&amp;)main.cpp:14:15:注意:没有已知的转换   参数1从'C'到'A&amp;'

2 个答案:

答案 0 :(得分:7)

C ++不允许您将非const引用绑定到临时文件,就像您尝试在此处执行一样:

b << C();
//   ^^^^ temporary

VS允许您将此作为&#34;扩展&#34;,但它是非标准的,因此不可移植,正如您所发现的那样。

您需要的是相关运营商中的const引用:

inline B& operator<<(const A& value)
//                   ^^^^^

答案 1 :(得分:1)

将其排序的一种方法是使用C ++ 11 rvalue绑定功能。

B& operator<<(A&& value)
{ ... }

作为一个过载。