Armadillo初始化程序列表无效

时间:2015-10-27 11:24:49

标签: c++ c++11 initializer-list armadillo

我在Windows 10下使用MSVC2013 64位编译器。

根据:

std::cout << arma::arma_version::as_string() << std::endl;

我有Armadillio图书馆的版本6.100.1(Midnight Blue)。

我启用了C ++ 11,例如

auto il = { 10, 20, 30 };
for(auto ele : il)
    cout<<ele<<endl;

正在运作。还正确添加了库,运行以下代码:

vec v;
v<<10<<20<<30;
cout<<v;

但是尝试使用Armadillio的初始化列表失败了。

vec v = { 1.0, 2.0, 3.0 };

导致编译错误:

错误:C2440:&#39;初始化&#39; :无法转换为初始化列表&#39;到&#39; arma :: Col&#39; 没有构造函数可以采用源类型,或构造函数重载解析不明确

2 个答案:

答案 0 :(得分:4)

文档说明vecCol<double的typedef:

  

为方便起见,定义了以下typedef:
   vec = colvec = Col&lt;双&gt;

如果我们查看Col构造函数,我们将找到以下接受初始化列表的构造函数:

#if defined(ARMA_USE_CXX11)

  template<typename eT>
  inline
  Col<eT>::Col(const std::initializer_list<eT>& list)
  {
    <...>   
  }

所以我的猜测是ARMA_USE_CXX11未定义,因此无法访问此构造函数。

答案 1 :(得分:4)

在文件夹 armadillo-6.100.1 \ include \ armadillo_bits 中 有一个名为 config.hpp 的配置文件。

你找到一段说:

#if !defined(ARMA_USE_CXX11)
// #define ARMA_USE_CXX11
//// Uncomment the above line to forcefully enable use of C++11 features (eg. initialiser lists).
//// Note that ARMA_USE_CXX11 is automatically enabled when a C++11 compiler is detected.
#endif

因此,看起来MSVC2013 64位未被Armadillio检测为C ++ 11编译器。因此,取消注释行

// #define ARMA_USE_CXX11

解决了我的问题。现在这就像魅力一样:

vec v = { 1.0, 2.0, 3.0 };
cout<<v;