【问题标题】:std::function<> and the Intel compiler version 11.1std::function<> 和英特尔编译器版本 11.1
【发布时间】:2011-06-29 20:47:11
【问题描述】:

我在英特尔编译器中使用 lambda 函数时遇到问题,尤其是以下代码无法编译:

template<typename T>
std::function<T (int)>  make_func(T x) {
  return [=](int index) -> T
  {
     return x;
  };
}

我得到的错误是

error: namespace "std" has no member "function"

代码在我的 Mac 上编译并运行良好,(macports gcc 版本 4.5)。错误在起作用,我们使用的是 Intel 编译器版本 11.1。它确实接受 lambda 函数(带有 -std=c++0x 选项),例如:

auto lam = [=](int j) -> int {
    printf("testing for lambdas: %d\t%d\n", n, j);
    return n;
};

int g = lam(7);

工作中安装的gcc版本是4.1.2,估计是标准库老了?

/bin/libc.so.6

说它是用 gcc 4.1.2 编译的 2.5 版。

有没有办法解决这个问题?

提前感谢您的帮助

【问题讨论】:

  • 您是否加入了&lt;functional&gt;

标签: c++ lambda intel


【解决方案1】:

在安装了 gcc 4.5.2 的系统上,我使用 icc 11.1 得到了相同的行为。

g++ 的标头 &lt;functional&gt;#ifdef __GXX_EXPERIMENTAL_CXX0X__ 保护,使用 icc 时未定义。

我会考虑在此设置中切换到 boost::function,这当然适用于 icc。

【讨论】:

  • 感谢您的回复。在#include 获得所需结果之前,是否会简单地#define GXX_EXPERIMENTAL_CXX0X?明天上班的时候我会试试的。我宁愿远离这个特定项目的提升。再次感谢。
  • @nmaxwell 我试过了,但 icc 被 gcc 4.5.2 库中随处可见的可变参数模板呛住了。我不知道您的 gcc 4.1.2 标头是否有这些。另一方面,boost 的 function.hpp 是一个只有头文件的库,可以在没有很多依赖的情况下添加它。
【解决方案2】:

好吧,显示的代码不包含 单个 标头。然而你参考了标准库std::function

所以不,它不会编译。与标准库的任何其他部分一样,您需要包含定义 std::function 的标头:&lt;functional&gt;

【讨论】:

  • 对不起,这是一个sn-p,我包含的标题是“#include #include #include #include ”跨度>
  • 谢谢,我只是假设函数会在标题“函数”中。编写 java 和 kotlin 代码让我假设了类似的东西 =)
猜你喜欢
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
相关资源
最近更新 更多