3

テンプレート化されたアダプターを使用して、オーバーロードされたオペレーターを使用できるようにしようとしています。矛盾しているように見えるコンパイル エラー (gcc 4.5.2) が発生します。その理由と回避方法を知りたいです。以下は、問題を説明する単純化されたコードです。

// The adapter
template <typename T>
class A {
    T t;
public:
    A(T t_) : t(t_) {}
};

// Utility function to return an adaptor
template <typename T>
A<T> make_A(T t) {
    A<T> a(t);
    return a;
}

// The operator overload on the adapter
template <typename T>
A<T> &operator<<(A<T> &a, int) {
    return a;
}

// Shows use case
int main(int,char**) {
    auto aa = make_A(1);
    aa << 2;        // Compiles

    // Desired use:
    make_A(4) << 5; // Compile Error
}

エラーメッセージ:

main_operatorinsert.cpp: In function ‘int main(int, char**)’:
main_operatorinsert.cpp:28:22: error: no match for ‘operator<<’ in ‘make_A [with T = int](4) << 5’
main_operatorinsert.cpp:18:11: note: candidate is: A<T>& operator<<(A<T>&, int) [with T = int]

「aa << 2;」という行はなぜ ここで、「make_A(4) << 5;」という行があります。ではない?make_A は aa と同じ型を返します。コンパイラが不一致になるのはなぜですか? どうすればこれを回避できますか?

4

2 に答える 2

3

make_Arvalueを返しますが、最初の引数としてoperator<<非 const左辺値が必要です。本当にサポートする必要がある場合は、メンバー関数make_A(4) << 5;を作成できますが、そこから左辺値参照を返すことは危険であることoperator<<に注意してください。

于 2012-05-16T20:16:41.613 に答える
2

make_A(4)一時 ( ) を非 const 左辺値参照にバインドすることはできません。

const参照にするか、一時的なものを避けることができます。C++11 では、右辺値参照を使用できます。

参照:非 const 参照が一時オブジェクトにバインドできないのはなぜですか?

于 2012-05-16T20:15:58.900 に答える