2013-02-26 5 views
0

У меня возникли проблемы с попыткой использовать ifstream изнутри блока. (. Это является частью более крупного, сложного проекта, поэтому я взбитыми быстрый небольшой исходный файл только с соответствующими частями)Как использовать std :: fstream изнутри блока?

// 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 S внутри блоков?

+1

Я не знаю, что такое объективный блок c, но вы могли бы использовать лямбда? – Pubby

+0

@Pubby Я не знаю, что такое лямбда, поэтому вместо этого я использую блоки Objective-C. XD –

+0

Это 'C++/CLI', а не' C++', правильно? – us2012

ответ

3

Block Implementation Specification От

Это ошибка, если C объект стека на основе ++ используется в блоке, если он не имеет конструктор копирования.

Что такое первая ошибка? ifstream blocks copy. __block требуется копия.

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

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

Попробуйте переключиться на lamda expressions from C++11 и посмотреть, не устранены ли эти проблемы.

+0

, не объявляя, что '__block' копирует переменную, когда блок создан – newacct

+0

@newacct исправил его до копии const –

Смежные вопросы