如何在块中使用std :: fstream?

时间:2013-02-26 02:24:08

标签: c++ objective-c-blocks objective-c++ ifstream

我在尝试使用块内的ifstream时遇到问题。 (这是一个更大,更复杂的项目的一部分,所以我只用相关部分制作了一个快速的小源文件。)

// 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() ;
}

如果我使用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的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

来自Block Implementation Specification

  

如果块中没有复制构造函数,则在块中使用基于堆栈的C ++对象,这是一个错误。

这是第一个错误 - ifstream blocks copy__block需要复制。

正如引言所说,一种选择是在堆上声明ifstream(new / delete)..但这很麻烦。

其余错误是简单的const正确性错误。不声明__block将对象作为const副本导入,这是两个错误中的第一个,并且它不能用于调用非close等const函数。

尝试切换到lamda expressions from C++11,看看他们是否可以缓解这些问题。