10

私はMSVC10でうまくコンパイルされるこのマップを持っています:

std::map<std::string, std::ofstream> m_logFiles;

しかし、C++0xを有効にしてg++4.5を使用しているubuntuでは、次のエラーメッセージが表示されます。

/usr/include/c++/4.5/bits/ios_base.h|785|error:'std :: ios_base :: ios_base(const std :: ios_base&)'はプライベートです

オブジェクトの代わりにポインタを使用することで、問題を解決しました。
Webで検索したところ、ストリームはコピーされたものではないことがわかりました(理由は十分に説明されています)。しかし、私の質問は、std :: ofstreamは活字ですか?もしそうなら、それは標準コンテナのテンプレートパラメータとしての使用を許可すべきではありませんか?
はいの場合、この点でg ++はMSVC10よりも遅れていますか?(これは、MSVCで動作する理由を説明します)。コンパイラの作成者に、最終的なものでもないものを完全に実装するように依頼するのはばかげていることは知っていますが、将来については興味があります。

g++4.6.1を使用しても役に立ちませんでした。

編集:コメントを読んでもう少し掘り下げたところ、地図の宣言ではなく、挿入が問題の原因であることがわかりました。

Cubbiのリンクを読んで私は以下を試しました:

#include <string>
#include <fstream>
#include <map>

using namespace std;

int main()
{
    map<string, ofstream> m_logFiles;
    ofstream st;
    m_logFiles.insert(make_pair<string, ofstream>(string("a"), move(st)));
    return 0;
}

しかし、それでも運はありません。g ++は、削除されたコピーコンストラクターの使用について不平を言います。

4

2 に答える 2

8

std::ofstream移動可能です。このプログラムは、clang /libc++を使用してコンパイルします。

#include <string>
#include <fstream>
#include <map>

int main()
{
    std::map<std::string, std::ofstream> m_logFiles;
}

参照27.9.1.11[ofstream.cons]。

于 2011-08-15T15:21:32.683 に答える
6

以前に同様の質問をしましたが、この回答で詳しく説明されているように、GCCはまだ可動fstreamをサポートしていないようです(GCC 4.6.1をテストしたばかりです) 。

于 2011-08-17T01:40:43.790 に答える