boost ublas 多精度模板解析失败 std::max

boost ublas multiprecision template resolution fails with std::max

我有一段非常简单的处理矩阵的代码。这是一个简短的摘录:

typedef boost::multiprecision::cpp_dec_float_100 SuperFloat;
typedef boost::numeric::ublas::matrix<SuperFloat> Matrix;
int function(Matrix& matrix){
  boost::numeric::ublas::permutation_matrix<std::size_t> pm(matrix.size1());
  int res = lu_factorize(matrix,pm); // this is a problem
  return res;
}

代码在我的笔记本上完美编译和运行,使用 g++ 5.2.0 和 boost 1.58。 但是,当我尝试在工作中使用 gcc 4.9.2 和 boost 1.53 的台式计算机上编译相同的代码时,我收到一条可怕的错误消息(模板参数数英里),最终导致:

cannot convert ‘boost::numeric::ublas::norm_inf 
# gazillions of template arguments
to type ‘const bool&’
std::max<S> (std::max<S> (norm_inf (e1), norm_inf (e2)), min_norm);
stl_algobase.h:261:5: note: template<class _Tp, class _Compare> const  _Tp& std::max(const _Tp&, const _Tp&, _Compare)
 max(const _Tp& __a, const _Tp& __b, _Compare __comp)

我现在有点疑惑。似乎参数的模板解析失败,这导致 max 的两个参数属于不同类型。不幸的是,我不能明确地对它们进行类型转换,因为导致问题的实际调用被埋在 boost uBLAS.

的某个地方

由于我能够在我的笔记本上使用不同的 gcc 和 boost 版本编译相同的代码,这里一定存在某种版本问题。从 gcc4.9 到 5.2 是否有一些影响模板分辨率的特殊变化,或者 uBLAS in boost 是否存在导致此问题的问题?

克服这些问题的建议方法是什么?虽然显而易见的解决方案是在我的工作计算机上更新 gcc 和 boost,但编写依赖于某些版本的 gcc 或 boost 的代码用于编译它当然不是很明智。

Is there some particular change from gcc4.9 to 5.2 that affects the template resolution, or is there an issue with uBLAS in boost that causes this problem?

很明显,你自己分析过了!

What is the suggested way of overcoming problems like these?

是,升级boost版本。使用该版本的 boost 支持的编译器版本(Boost 非常自由地支持 "older" 编译器)。

it's certainly not very advisable to write code that relies on certain versions of gcc or boost to be used to compile it.

确实不是。所以你写的是一个相当新的版本,它将被支持一段时间。

问题是事情不会 "randomly" 坏掉。从 1.53 升级到 1.58 并不能神奇地解决您的问题,并破坏无数其他东西。版本正在逐步改进。

因此,如果升级破坏了某些东西,那么您会提交错误报告,因为它是一种回归。¹

实际上,由于现有测试,这种情况并不经常发生。这是 双重真实 对于在以前版本中主动修复的任何错误,因为许多开发人员在修复之前将测试用例创建为复制器,并且测试保持在 左右,正是为了防止倒退


¹ 如果某个库有意做出重大更改,则始终会在发行说明中进行记录。大多数情况下,旧行为在过渡期间仍然可用,要么在不同的命名空间中,要么使用特定的预处理器定义。