如何从clang替换失败错误中获取更多信息?

时间:2013-06-13 15:13:21

标签: debugging c++11 clang template-meta-programming eigen3

我在Eigen3矩阵周围有以下std::begin包装器:

namespace std {
template<class T, int nd> auto begin(Eigen::Matrix<T,nd,1>& v)
-> decltype(v.data()) { return v.data(); }
}

替换失败,我收到编译错误( 错误:没有匹配函数来调用'begin')。对于此重载,clang输出以下内容:

.../file:line:char note: candidate template ignored: 
substitution failure [with T = double, nd = 4]
template<class T, int nd> auto begin(Eigen::Matrix<T,nd,1>& v)
                               ^

我希望选择此重载。我希望类型为doubleint,即它们是推导出来的,因为我希望它们被推导出来(并且希望正确)。通过查看函数,我看不到任何可能实际失败的东西。

我偶尔会遇到类似的错误。在这里,clang告诉我:替换失败,我没有将此函数放入重载决策集。但是,这并没有帮助我调试 at all 为什么替换失败了?究竟什么都无法替代哪里?对我来说唯一明显的是编译器知道,但故意不告诉我:(

  • 是否可以强制 clang告诉我这里究竟失败了什么

  • 这个功能很简单,我遇到了问题。在更复杂的功能中,我猜情况只会变得更糟。你如何调试这些错误?

2 个答案:

答案 0 :(得分:2)

您可以通过自己替换原始模板的cut'n'paste来调试替换失败,并查看编译器为完全专用的代码喷出的错误。在这种情况下:

namespace std {
auto begin(Eigen::Matrix<double,4,1>& v)
-> decltype(v.data()) {
  typedef double T; // Not necessary in this example,
  const int nd = 4; // but define the parameters in general.
  return v.data();
}
}

答案 1 :(得分:1)

嗯,这已被报道为铿锵声中的bug。不幸的是,clang开发者仍然不知道修复它的最佳方法。在此之前,您可以使用gcc来报告回溯,或者您可以将此patch应用于clang 3.4。该补丁是一种快速破解,可将替换失败转化为错误。