私はストリーム上でテンプレート化されたクラスStreamContainerを書きたいハンドルを作る:私は、次のクライアントコードと思うだろうストリーム上で、テンプレートクラスは、STDの両方:: coutのとstd :: ofstreamの
#ifndef STREAMCONTAINER_HPP
#define STREAMCONTAINER_HPP
#include <string>
#include <iostream>
template<typename Stream>
class StreamContainer
{
public:
StreamContainer(std::ostream& os)
: m_stream(os) {}
private:
Stream & m_stream;
};
#endif
を作品:
#include "StreamContainer.hpp"
#include <fstream>
int main(int argc, char argv[])
{
std::ofstream ofs;
ofs.open("c:\\code\\temp.txt");
StreamContainer<decltype(std::cout)> coutContainer(std::cout); // C2439
StreamContainer<std::ofstream> fileContainer(ofs); // C2664
}
は、しかし、それはSTDに合格しようとすると、少なくとものVisual C++ 2015で、動作しません:: coutでは、原因となるエラーC2439(メンバーは初期化できませんでした)とstd :: ofstreamのオブジェクトを渡ししようとしていますエラーC2664が発生します(std :: basic_ofstreamのコンストラクタはstd :: basic_ostreamからconst char *)。私はまた、移動コンストラクタを使用してみましたが、それに他の問題がありました。これを解決する方法に関する提案は非常に高く評価されます。
コンストラクタのパラメータが 'Std :: ostream&'で、Stream& 'ではないのはなぜですか? – interjay
どちらも 'std :: ostream&'に変換できます。なぜそれを使用しないのですか?ここにテンプレートは必要ありません。 –
優秀な質問、@interjay。私がその変更を行うと、問題はなくなります。私は、テンプレート置換(ストリームはstd :: ofstreamにすることができます)を使用して、実行時の置換(std :: ostreamへの参照はstd :: ofstreamへの参照になります)を混乱させていたと思います。 – Alan