犰狳初始化列表无法工作

6

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

根据:

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

我有Armadillio库的6.100.1版本(午夜蓝)。

例如,我启用了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:'initializing':无法将“initializer-list”转换为“arma::Col” 没有构造函数可以接受源类型,或者构造函数重载分辨率不明确


你是从零开始构建的吗? - SingerOfTheFall
2个回答

5
在文件夹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

看起来Armadillo不能将MSVC2013 64位识别为C++11编译器。因此,请取消注释该行。
// #define ARMA_USE_CXX11

解决了我的问题。现在它就像魔术一样正常工作:
vec v = { 1.0, 2.0, 3.0 };
cout<<v;

1
MSVC 2013 不支持 C++11,因此它无法被检测到。 - hbrerkere
这适用于MSVC 2019。有人能说一下为什么吗? - Tarun Maganti

4
文档说明vecCol<double>的typedef:

为了方便起见,已定义以下typedef:
vec = colvec = Col< double >

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

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

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

是的,没错,我已经修复了,可以看看我的答案。非常感谢你的帮助。 - newandlost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接