我试图了解如何最好地利用我的模板化类中的块。
我有以下代码片段:

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 会接受该程序。

最佳答案

这是 GCC 中的一个问题。我在 LLVM 3 下测试了你的程序,它编译得很好。

GCC 4.2 的块实现存在许多问题,有时可以通过完全限定块声明 ^int(int arg){return 1 + arg;} 来解决这些问题,但在这种情况下无法解决此问题。我强烈建议使用 LLVM/Clang 来进一步处理 Obj-C 块。现在它的 C++ 支持非常好,尤其是对 C++03 的支持。

关于c++ - 错误 : cannot convert ‘int (^)(int)’ to ‘R (^)(T)’ in initialization,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8156184/

10-11 14:37