0

ifstreamブロック内で fromを使用しようとすると問題が発生します。(これは大規模で複雑なプロジェクトの一部であるため、関連する部分だけを含む簡単な小さなソース ファイルを作成しました。)

// foo.cpp, in its entirety:

#include <iostream>
#include <fstream>
#include <Block.h>

int main() {
    __block std::ifstream file("/tmp/bar") ;
    // ^ tried this with and without the __block
    void (^block)() = ^{
        file.rdbuf() ;
        file.close() ;
        file.open("/tmp/bar") ;
    } ;
    block() ;
}

withを宣言するifstream__block、次のようになります。

foo.cpp:6:24: error: call to implicitly-deleted copy constructor of
      'std::ifstream' (aka 'basic_ifstream<char>')
        __block std::ifstream file("/tmp/bar") ;
                              ^~~~

なしで宣言すると__block、次のようになります。

foo.cpp:8:3: error: call to implicitly-deleted copy constructor of
      'const std::ifstream' (aka 'const basic_ifstream<char>')
                file.rdbuf() ;
                ^~~~
                // rdbuf() and (presumably) other const functions

foo.cpp:9:3: error: member function 'close' not viable: 'this' argument has
      type 'const std::ifstream' (aka 'const basic_ifstream<char>'), but
      function is not marked const
                file.close() ;
                ^~~~
                // open(), close(), and (presumably) other non-const functions

fstreamブロック内で sを使用する適切な方法は何ですか?

4

1 に答える 1

3

ブロック実装仕様から

スタックベースのC++オブジェクトがコピーコンストラクターを持たない場合、ブロック内で使用されるとエラーになります。

これが最初のエラーです-ifstreamブロックコピー__blockコピーが必要です。

引用符が示すように、1つのオプションはheap(new/ delete)..でifstreamを宣言することですが、それは面倒です。

残りのエラーは、単純なconstの正当性エラーです。宣言しない__blockと、オブジェクトがconstコピーとしてインポートされます。これは、2つのエラーの最初のエラーであり、のような非const関数を呼び出すために使用することはできませんclose

からlamda式C++11に切り替えて、これらの問題が軽減されるかどうかを確認してください。

于 2013-02-26T03:08:39.003 に答える