У меня возникли проблемы при попытке использовать 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
внутри блоков?
От Спецификация реализации блока
Ошибка, если в блоке используется стековый объект C ++, если у него нет конструктора копирования.
Какая первая ошибка — ifstream
копирование блоков. __block
требуется копия.
Как говорится в цитате, один из вариантов — объявить ifstream в куче (new
/delete
) .. но это грязно.
Остальные ошибки являются простыми ошибками правильности. Не декларирует __block
импортирует объекты как константную копию, которая является первой из двух ошибок, и ее нельзя использовать для вызова неконстантных функций, таких как close
,
Попробуйте переключиться на лямда-выражения от C++11
и посмотрим, облегчат ли они эти проблемы.
Других решений пока нет …