テンプレートの種類が異なる 2 つのインスタンス間の比較演算子を提供するクラス テンプレートを作成しようとしています。よくあることですが、このオペレーターは非会員の友人です。私が達成しようとしていることの簡単な例を以下に示します。
template<typename T>
class Wrapper {
// Base type, which must have a val() method to allow comparison
T t_;
public:
Wrapper(const T& t) : t_(t) {}
// Comparison operator
template<typename B>
friend
bool
operator==(const Wrapper &a, const Wrapper<B>&b) {
return a.t_.val()==b.t_.val();
}
};
// First example type for Wrapper
class X {
int x_;
public:
X(int x) : x_(x) {}
int
val() const {return x_;}
};
// Second example type for Wrapper
class Y {
int y_;
public:
Y(int y) : y_(y) {}
int
val() const {return 2*y_;}
};
int
main() {
Wrapper<X> WX(X(4));
Wrapper<Y> WY(Y(2));
return WX==WY ? 1 : 0;
}
この例 (g++ 4.4.0) はコンパイルされません。代わりに、y_
fromWrapper<Y>
がプライベートであり、friend 関数にアクセスできないと不平を言います。その理由はわかります。しかし、どうすればこれを修正できますか? 逆関数に友情を追加する
template<typename B>
friend bool operator==(const Wrapper<B> &, const Wrapper &);
Wrapper クラスのテンプレート本体に挿入すると、コンパイラにあいまいさが生じるだけです。Wrapper クラスの異なるインスタンスが互いのプライベート メンバーにアクセスできるようにしたくありません。この 1 つのオペレーターへのアクセスを制限したいのです。これは可能ですか?
私のラップトップは脱気の危険にさらされているので、どんなアイデアでも私とラップトップ (そしてそのウィンドウ) の両方に喜ばれるでしょう。