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++ では、ここで行おうとしているように、非 const 参照を一時的にバインドすることはできません。

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

VS ではこれを「拡張機能」として実行できますが、これは非標準であるため、移植性がありません。

必要なのはconst、関連する演算子の参照です。

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