1

重複の可能性:
演算子をオーバーロードするときにstd::endlのタイプが不明です<<

#include <iostream>

using namespace std;

struct OutputStream
{
    template<class T>
    OutputStream& operator <<(const T& obj)
    {
        cout << obj;

        return *this;
    }
};

OutputStream os;

int main()
{    
    os << 3.14159 << endl; // Compilation Failure!
}

VC++2012コンパイラは次のように文句を言います。

エラーC2676:バイナリ'<<':'OutputStream'は、この演算子または事前定義された演算子に受け入れられる型への変換を定義していません

4

1 に答える 1

4

その理由は、コンパイラがのタイプを推測できないためです。これは、次のように定義された関数テンプレートTであるためです。std::endl

template <class charT, class traits>
  basic_ostream<charT,traits>& endl ( basic_ostream<charT,traits>& os );

IOStreamsでそれを克服する方法は、次の適切なオーバーロードを提供することですoperator<<

OutputStream& operator <<(std::ostream& ( *pf )(std::ostream&))
{
  cout << pf;
  return *this;
}
于 2013-02-05T23:23:18.893 に答える