VC++(2015)およびg ++ 5.4.0(--std == C++ 14)を使用して、演算子==のオーバーロード、コンパイラエラーの問題が発生しました。ここでは、コード(これは私の本当のコードベースでは、より複雑な状況の単なる抽出物である)です。テンプレートサブクラスの演算子オーバーライド問題==
#include <vector>
template<typename T>
struct A {
struct B {
std::vector<T> _elements;
// Internal cmp op.
bool operator==(const B &other) {
return _elements == other._elements;
}
};
std::vector<B> _entries;
};
// External cmp op.
template<typename T>
inline bool operator==(typename const A<T>::B &l, typename const A<T>::B & r) {
return l._elements == r._elements;
}
int main() {
A<int>::B b0, b1;
b0.operator==(b1); // a
operator==<int>(b0, b1); // b
b0 == b1; // c
std::vector<A<int>::B> v0, v1;
std::equal(v0.begin(), v0.end(), v1.begin()); // d
v0 == v1; // e
return 0;
}
私はVC++とg ++エラーのドイツ語版を持っているので、私はない、エラーメッセージを追加します多くの行にまたがる
VC++は(e)にエラーを示します。理由は理解できません。ベクトル< :: :: operator ==はstd :: equalを内部的に呼び出すように見え、(d)はうまくコンパイルされます。なぜこれは失敗するのですか?
g ++は外部演算子==()を受け入れないため、この短いコードを完全にコンパイルできません。両方のコンパイラで動作するA <T> :: Bの外部演算子==()を書く方法は知られていません。
私はまだclangを試していません。
多くのありがとうございます。
"私はドイツ語版のVC++を持っていて、g ++のエラーは多くの行にまたがっています。英語のものはそれほど良いものではありません。 – user4581301