我在尝试使用块内的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
的正确方法是什么?
答案 0 :(得分:3)
来自Block Implementation Specification
如果块中没有复制构造函数,则在块中使用基于堆栈的C ++对象,这是一个错误。
这是第一个错误 - ifstream
blocks copy。 __block
需要复制。
正如引言所说,一种选择是在堆上声明ifstream(new
/ delete
)..但这很麻烦。
其余错误是简单的const正确性错误。不声明__block
将对象作为const副本导入,这是两个错误中的第一个,并且它不能用于调用非close
等const函数。
尝试切换到lamda expressions from C++11
,看看他们是否可以缓解这些问题。