【发布时间】: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<double> &x): MyClass(arma::vec(x.begin(), x.end()))。或者他们的向量类提供的任何其他接口。另外,我建议将std::vector参数改为const&而不是 value,因为你不会离开它。 -
@NicolBolas,这里使用 begin 和 end 不起作用
no matching function for call to ‘arma::Col<double>::Col(std::vector<double>::iterator, std::vector<double>::iterator)’ : MyClass(arma::vec(x.begin(), x.end()))。感谢const &,我会在我的代码中应用它。 -
我没想到它会起作用。就像我说的:“或者他们的向量类提供的任何其他接口。”这意味着“去看看他们的文档并找到一个合适的构造函数来复制数据数组”。
标签: c++ c++11 initializer-list armadillo overloading