ошибка: невозможно преобразовать int (^) (int) в R (^) (T) при инициализации - PullRequest
3 голосов
/ 16 ноября 2011

Я пытаюсь понять, как лучше всего использовать блоки в моем шаблонном классе.У меня есть следующий фрагмент кода:

template<typename T, typename R>
class MyClass {
public:
   typedef R (^Block)(T);

   MyClass(Block blk) {}
};

void testMyClass() {
    MyClass<int,int>::Block blk(^(int arg) {
        return 1 + arg;
    });
}

Когда я пытаюсь скомпилировать это, я получаю следующее сообщение об ошибке:

error: cannot convert ‘int (^)(int)’ to ‘R (^)(T)’ in initialization

Я что-то упускаю из виду?Я пытаюсь сделать что-то, что не разрешено?GCC принимает программу, если я делаю то же самое без шаблонов.

1 Ответ

6 голосов
/ 17 ноября 2011

Это проблема в GCC. Я протестировал вашу программу под LLVM 3, и она прекрасно скомпилировалась.

Существует ряд проблем в реализации блоков GCC 4.2, иногда их можно обойти, полностью квалифицировав объявления блоков ^int(int arg){return 1 + arg;}, но в этом случае он не смог обойти эту проблему. Я настоятельно рекомендую использовать LLVM / Clang для дальнейшей работы с блоками Obj-C. Его поддержка C ++ очень хороша в наши дни, особенно для поддержки C ++ 03.

...