我在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)
^
我希望选择此重载。我希望类型为double
和int
,即它们是推导出来的,因为我希望它们被推导出来(并且希望正确)。通过查看函数,我看不到任何可能实际失败的东西。
我偶尔会遇到类似的错误。在这里,clang告诉我:替换失败,我没有将此函数放入重载决策集。但是,这并没有帮助我调试 at all 。 为什么替换失败了?究竟什么都无法替代哪里?对我来说唯一明显的是编译器知道,但故意不告诉我:(
是否可以强制 clang告诉我这里究竟失败了什么?
这个功能很简单,我遇到了问题。在更复杂的功能中,我猜情况只会变得更糟。你如何调试这些错误?
答案 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)