2011-11-16 10 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;}を完全修飾することで回避できますが、この場合はこの問題を回避できませんでした。私は、Obj-Cブロックを使用してさらに作業するために、LLVM/Clangを使用することを強くお勧めします。最近のC++サポートは、特にC++ 03のサポートのために非常に良いです。

+0

ありがとう!私はそれがclangと共存していることを知っています++そして私はそれがコンパイラの問題だと思っていましたが、何らかの回避策を期待しました。私は最終的にclangに切り替えるが、他の問題がATMを妨げている。 – Krumelur

関連する問題