2011-11-16 25 views
3

我想了解如何最好地利用模板类中的块。 我有下面的代码片段:错误:无法在初始化中将'int(^)(int)'转换为'R(^)(T)'

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

+0

我不知道这是什么,但它不是C++。 –

+0

块是一种语言扩展,如果这是你的意思。 http://en.wikipedia.org/wiki/Blocks_(C_language_extension) – Krumelur

+1

我删除了C++标记,因为这不是C++。 –

回答

6

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

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

+0

谢谢!我知道它与铿锵语++复制,我怀疑这是一个编译器问题,但我希望有某种解决方法。我最终会切换到clang,但其他问题却阻止了我的ATM。 – Krumelur

相关问题