以下代码无法在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;'
答案 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)
{ ... }
作为一个过载。