2011-11-16 50 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

相關問題