【问题标题】:error: cannot convert ‘int (^)(int)’ to ‘R (^)(T)’ in initialization错误:初始化时无法将‘int (^)(int)’转换为‘R (^)(T)’
【发布时间】:2011-11-16 17:45:01
【问题描述】:

我正在尝试了解如何最好地利用我的模板类中的块。 我有以下代码sn-p:

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

【问题讨论】:

  • 我不知道这是什么,但它不是 C++。
  • Blocks 是一种语言扩展,如果这就是你的意思的话。 en.wikipedia.org/wiki/Blocks_(C_language_extension)
  • 我删除了 C++ 标签,因为这不是 C++。
  • 具有编译器特定扩展的 C++ 是否仍可称为 C++?我不知道。
  • 回滚标签删除。 GCC 可以使用 Apple 的块扩展 来构建 C++ 项目。

标签: c++ macos gcc objective-c-blocks


【解决方案1】:

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

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

【讨论】:

  • 谢谢!我知道它与 clang++ 一起编译,我怀疑这是一个编译器问题,但我希望有某种解决方法。我最终会切换到 clang,但其他问题阻止了我 ATM。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2021-08-21
相关资源
最近更新 更多