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

ar2*_*015 3 c++ templates armadillo c++11

我定义了一个犰狳矩阵,并尝试根据其手册通过初始化列表来初始化它。

\n\n

除非我尝试定义列矩阵,否则没问题。

\n\n

为什么是暧昧呢?

\n\n
#include <armadillo>\n\nint main()\n{\n    // ok : square matrix\n    arma::mat A={{1.0,2.0},{3.0,4.5}};\n\n    // ok: row matrix\n    arma::mat B={3.5,4.0};\n\n    // error: conversion from \xe2\x80\x98<brace-enclosed initializer list>\xe2\x80\x99 to \n    // \xe2\x80\x98arma::mat {aka arma::Mat<double>}\xe2\x80\x99 is ambiguous\n    arma::mat C={{3.5},{4.0}};\n\n    // ok: column matrix\n    arma::mat D=arma::mat({3.5,4.0}).t();\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

mta*_*all 5

这是 C++11/14 标准的问题。因为每个内部集合中只有一个元素,所以该标准本质上说{{3.5},{4.0}}也可以解释为{3.5,4.0}。换句话说,{3.5}可以隐式转换为double(3.5). 这导致两个构造函数之间存在歧义。

一种可能的解决方案是使用犰狳列向量构造函数:

arma::mat C = arma::colvec( {3.5, 4.0} );
Run Code Online (Sandbox Code Playgroud)