4
4

1 に答える 1

13
friend A f();

この行は、非テンプレート関数A f()が存在し、クラスのフレンドであることを宣言します。 これは と同じ機能ではありませんf<A>()-- 完全に新しい機能です。

friend B f();

この行は、同じ名前で別の非テンプレート関数を宣言していますが、戻り値の型は異なります。関数の戻り値の型をオーバーロードできないため、これは禁止されています。

これらのフレンド宣言はどちらもテンプレート関数を参照しておらず、2 番目の例では、2 つのフレンド宣言は以前に宣言されたテンプレート関数を参照してません。最初の例のフレンド宣言と同様に、他の非テンプレート関数を参照します。

これはおそらくあなたが意図したものです:

class A {
    friend A f<A>();
};

class B {
    friend B f<B>();
};

そして、2番目の例を修正するには:

class A {
    friend void f<A>(A);
};

class B {
    friend void f<B>(B);
};
于 2015-01-13T21:32:37.000 に答える