C ++でネストされた演算子のオーバーロードを使用する場合のコンパイラエラー
-
06-07-2019 - |
質問
単純な比較のために==、<!> lt;、<!> gt ;、および!=演算子をオーバーロードするURLクラスがあります。 URLクラスには、文字列データメンバーと、文字列に作用するいくつかの関数があります。 URLクラスでテストすると、演算子は正常に機能します。
URLデータメンバーを持つPageクラスもあります。 Pageクラスの同じ演算子をオーバーロードしようとしています。 Pageクラスの平等はそれぞれのURLの平等に基づいているため、ページの比較にはURLクラスのブール演算子を使用します。これにより、理解できないコンパイラエラーが発生します。 URL演算子のコード:
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
ページ演算子のコード:
bool Page::operator ==(Page & p) const {
//url is the URL instance variable of the Page class
return url == p.GetURL();
}
これにより、次のようなエラーが生成されます。
src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const
私が忘れているのは愚かなことだと予測しています。私を正しく証明してくれますか?
編集: Constの正確さは、私を苦しめました。助けてくれてありがとう。
解決
次のようになっているはずです:
bool URL::operator ==(const URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
他の演算子についても同様です。
まだコンパイラエラーが発生する場合は、おそらくGetURL()
constも作成していない可能性があります。
std:string URL::GetURL() const {
// whatever...
}
他のヒント
また、実装の詳細の変更から外部エンティティを保護するためのメソッド(つまり、パブリックインターフェイス)があることを指摘したいと思います。また、クラスは(同じ理由で)自動的にそれ自体の友人であり、したがって、他のオブジェクトのメンバーにアクセスするだけでかまいません。
bool URL::operator ==(URL & u) const {
//url is the string instance variable
return url == u.GetURL();
}
次のように記述できます:
bool URL::operator ==(URL & rhs) const
{
return url == rhs.url; // No need to use GetURL()
}
これにより、コードがより明確になります(ただし、これは好みが異なる場合があるという意見です)
所属していません StackOverflow