【问题标题】:arma::vector mistaken with std::vectorarma::vector 与 std::vector 错误
【发布时间】:2016-01-24 14:30:14
【问题描述】:

Armadillo 的 C++11 功能在 Cygwin 上被禁用。但它适用于 Linux。

我希望我的代码是跨平台的。

起初:

// constructor
MyClass(arma::vec x)
{
    init(x);
}

当我将数组传递给它时,它不起作用,因为在 Cygwin 上未启用 Armadillo 的 C++11 选项:

MyClass a({1.0,2.0,3.0});

在Cygwin中运行Linux会报错。

为了解决这个问题,我通过添加另一个构造函数来修改代码:

// constructor
MyClass(arma::vec x)
{
    init(x);
}

// constructor
MyClass(std::vector<double> x)
{
    arma::vec x2;
    for(auto d:x)
        x2<d;
    init(x2);
}

现在,此代码在 Cygwin 上运行良好,但在 Linux 中会导致错误。

MyClass a({1.0,2.0,3.0});

error: call of overloaded ...  is ambiguous

如何解决这种歧义?

【问题讨论】:

  • init(x) 请停止使用两阶段初始化。这就是 C++11 委托构造函数的用途。另外,修复 Cygwin 上的犰狳问题不是更容易吗?
  • @NicolBolas,犰狳是我无法控制的图书馆。 C++11 不是犰狳的问题,但实现不完整是 Cygwin 的问题。顺便说一句,在这种情况下如何避免init?在创建 x2 之前,我无法调用另一个构造函数。
  • 我不知道犰狳的vec 课程的详细信息,但类似这样的:MyClass(const std::vector&lt;double&gt; &amp;x): MyClass(arma::vec(x.begin(), x.end()))。或者他们的向量类提供的任何其他接口。另外,我建议将 std::vector 参数改为 const&amp; 而不是 value,因为你不会离开它。
  • @NicolBolas,这里使用 begin 和 end 不起作用 no matching function for call to ‘arma::Col&lt;double&gt;::Col(std::vector&lt;double&gt;::iterator, std::vector&lt;double&gt;::iterator)’ : MyClass(arma::vec(x.begin(), x.end())) 。感谢const &amp;,我会在我的代码中应用它。
  • 我没想到它会起作用。就像我说的:“或者他们的向量类提供的任何其他接口。”这意味着“去看看他们的文档并找到一个合适的构造函数来复制数据数组”。

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


【解决方案1】:

创建接受std::initializer_list&lt;double&gt;的ctor

【讨论】:

  • 像魅力一样工作。但它与std::vector&lt;double&gt; 有何不同?
  • 当你传递花括号初始化器时,强烈推荐带有 initializer_list 的构造函数
猜你喜欢
  • 1970-01-01
  • 2020-09-22
  • 1970-01-01
  • 2021-12-27
  • 2012-06-30
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多