1

下面的代码不能在 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 日志

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

4

2 回答 2

7

C++ 不允许您将非常量引用绑定到临时对象,就像您在这里尝试做的那样:

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

VS 允许您将其作为“扩展”来执行,但正如您所发现的,它是非标准的,因此不可移植。

您需要的是const相关运算符中的参考:

inline B& operator<<(const A& value)
//                   ^^^^^
于 2013-08-05T14:56:17.073 回答
1

一种解决方法是使用 C++11 右值绑定功能。

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

作为过载。

于 2013-08-05T16:08:08.633 回答