1

std::beginEigen3 行列の周りに次のラッパーがあります。

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

置換が失敗し、コンパイラ エラーが発生します ( error : no matching function for call to '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)
                               ^

このオーバーロードを選択してほしい。私は型がdoubleandintであることを期待しています。関数を見ると、実際に失敗する可能性があるものは何もありません。

時々、同様のエラーが発生します。ここで、clang は次のように教えてくれますただし、これはデバッグにはまったく役立ちません。置換が失敗した理由は何ですか? どこで代用できなかったのですか?私にとって明らかな唯一のことは、コンパイラが知っているということですが、意図的に教えていません:(

  • ここで正確に何が失敗したかをclangに強制することは可能ですか?

  • この機能は簡単で、問題があります。より複雑な機能では、事態は悪化するだけだと思います。この種のエラーをどのようにデバッグしますか?

4

2 に答える 2

1

これはclangのバグとして報告されています。残念ながら、clang の開発者はまだそれを修正する最善の方法を知りません。それまでは、バックトレースを報告する gcc を使用するか、このパッチを clang 3.4 に適用できます。パッチは、置換の失敗をエラーに変える簡単なハックです。

于 2014-01-12T03:33:53.230 に答える