犰狳初始化列表不起作用

Posted

技术标签:

【中文标题】犰狳初始化列表不起作用【英文标题】:Armadillo initializer list is not working 【发布时间】:2016-01-26 18:58:51 【问题描述】:

我在 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;

但尝试为犰狳使用初始化列表失败了。

vec v =  1.0, 2.0, 3.0 ;

导致编译错误:

错误:C2440: 'initializing' : 无法从 'initializer-list' 转换为 'arma::Col' 没有构造函数可以采用源类型,或者构造函数重载决议不明确

【问题讨论】:

你是从头开始构建的吗? 【参考方案1】:

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

【讨论】:

MSVC 2013 不正确支持 C++11,这就是它未被检测到的原因。 这适用于 MSVC 2019。任何人都可以提及为什么会这样吗?【参考方案2】:

文档说vecCol&lt;double 的类型定义:

为方便起见,定义了以下类型定义: vec = colvec = Col

如果我们查看 Col 构造函数,我们会发现以下接受初始化列表的构造函数:

#if defined(ARMA_USE_CXX11)

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

所以我的猜测是 ARMA_USE_CXX11 没有定义,因此这个构造函数是不可访问的。

【讨论】:

是的,没错,我修好了,看看我的回答。非常感谢您的帮助。

以上是关于犰狳初始化列表不起作用的主要内容,如果未能解决你的问题,请参考以下文章

C++:犰狳列矩阵初始化不明确

更改下拉列表中 Datepicker 的属性更改不起作用

成员列表初始化与继承?

如何从不同的类初始化方法中的列表项?

如何使用许多字符串值初始化字符串列表 (List<string>)

想要使用循环将数组列表项放入变量中