Как мне использовать std :: fstream из блока?

У меня возникли проблемы при попытке использовать 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

Решение

От Спецификация реализации блока

Ошибка, если в блоке используется стековый объект C ++, если у него нет конструктора копирования.

Какая первая ошибка — ifstream копирование блоков. __block требуется копия.

Как говорится в цитате, один из вариантов — объявить ifstream в куче (new/delete) .. но это грязно.

Остальные ошибки являются простыми ошибками правильности. Не декларирует __block импортирует объекты как константную копию, которая является первой из двух ошибок, и ее нельзя использовать для вызова неконстантных функций, таких как close,

Попробуйте переключиться на лямда-выражения от C++11 и посмотрим, облегчат ли они эти проблемы.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]