1

以下は、私の MinGW コンパイラでコンパイルされ、期待どおりに実行される単純な C++ プログラムです。

#include <iostream>


template <class T> class A {
    T a;
    template <class U> friend class B;

  public:
    A<T> (T t) : a(t) {}
};



template <class T> class B {
   A<T> aa;

  public:

    B<T> (T t) : aa(t) {}

    T getT() const {return aa.a;}
};


int main() {
    B<int> b(5);
    std::cout << "> " << b.getT() << std::endl;
}

プライベート会員にB<T>::getT()アクセスするので、LINEで友達作り。 A<T>::aA<T>B<T>template <class U> friend class B;

残念ながら、なぜこの行をこのように書く必要があるのか​​わかりません。直感的には のようなものを期待friend class B<T>していましたが、これはコンパイルされません。

との依存型は両方の場合にあるため、新たに導入された の意味もU不明です。ABT

つまり、要するに、この行の構文がどのように派生または推定されるかについて、少しでも光を当てていただければ幸いです。

4

2 に答える 2

5

友情とテンプレートにはさまざまな順列があります。

あなたの現在のコードは、 のテンプレートBを のフレンドに特殊化します。A<T>たとえば、B<char>は のフレンドですA<int>

マッチング相手を友達にしたいだけの場合はA<T>、次のように言います。

template <typename> class B;  // forward declare above!

template <typename T>
class A
{
    // ...

    friend class B<T>;
};
于 2012-12-04T22:38:04.170 に答える
3

私見、friend class B<T>;前方宣言を挿入していればうまくいったでしょう

template<class T> class B;

その前にclass A<T>

はだけでなく、template <class U> friend class B;すべてclass B<U>の人を友達にしclass B<T>ます。

于 2012-12-04T22:36:23.370 に答える