2017-12-15 7 views
1

私はエラー"C2280:削除された関数を参照しようとすると、" 得た:ガットエラーC2280はstdを使用:: vector.push_back()

std::ofstream ofs(m_headerFileName, std::ios::binary, std::ios_base::app); 
      m_ofsHeader.push_back(ofs); 

std::vector<std::ofstream>  m_ofsHeader; 
次のコードを実行するときにエラーをコンパイル

ofstreamインスタンスをofstreamvectorにプッシュできない理由がわかりません。誰かが何かヒントを与える?ありがとう。私はWindows 7とVisual Studio 2015を使用しています。 また、もしあればここでウォークアラウンドは何ですか?

私はに、それぞれ独自のファイルを読み書きするifstream/ofstreamをたくさん用意しています。

+4

ストリームは、ストリームのみの1つのインスタンスがある、コピーすることはできませんが。 –

+0

回避策は何ですか? –

+0

C++ 11でストリームを移動できます。 – rafix07

答えて

3

ストリームにはコピーコンストラクタがありません。独自の、あるいはおそらく移動セマンティクスを実装するかもしれません。

+1

*「あなた自身で実装するかもしれない」* - どういう意味ですか?標準クラスに対して独自のコピーコンストラクタを実装することはできません。 –

+0

@ChristianHackl Hmmm ...オーバーフロー、アンダーフローなどのストリームや上書きのものからのドライブ...それは難しいかもしれないが、まだ可能です(そして、私の答えの時までにOPが望んでいるので、XY問題が発生していることが明確ではありませんでした) –

1

ストリームはコピーできません。それらのコピーコンストラクタおよびコピーアサイナは、deleteとマークされています。移動の意味だけでなく、std::vector::emplace_back()を使用することを検討してください:あなたはおそらく意味

std::ofstream ofs(m_headerFileName, std::ios::binary, std::ios_base::app); 

m_ofsHeader.emplace_back(std::move(ofs)); 
      ^~~~~~~  ^~~~ 
3

まず、以下の3つの引数を取って何std::ofstreamコンストラクタが存在しないため、間違っています:

std::ofstream ofs(m_headerFileName, std::ios::binary | std::ios::app) 

次に、年齢問題。ストリームをコピーできないため、push_backが失敗します。

あなただけの代わりに、ストリームを移動することができ:

#include <fstream> 
#include <vector> 
#include <ios> 

int main() 
{ 
    std::vector<std::ofstream> streams; 

    std::ofstream os("foo.txt", std::ios::binary | std::ios::app); 
    streams.push_back(std::move(os)); 
} 

push_back&&オーバーロードが使用されるようにosをキャストstd::move、。

それとも、ベクトル内のストリームへstd::unique_ptr sの保存:

#include <fstream> 
#include <memory> 
#include <vector> 
#include <ios> 

int main() 
{ 
    std::vector<std::unique_ptr<std::ofstream>> streams; 

    auto os = std::make_unique<std::ofstream>("foo.txt", std::ios::binary | std::ios::app); 
    streams.push_back(std::move(os)); 
} 
+0

あなたの答えは私よりもはるかに優れています:) –

関連する問題