2

フレンド クラスがどのように機能するかを理解するためだけに作成した 2 つの単純なクラスがあります。なぜこれがコンパイルされないのか、また Linear クラスが Queues クラス内の構造体にアクセスできるのか、私は混乱していますか?

Linear.h

template<typename k, typename v >
 class Linear
 {
    public:
    //Can I create a instance of Queues here if the code did compile? 

    private:
  };

Linear.cpp

#include "Linear.h" 

Queues.h

 #include "Linear.h"

 template<typename k, typename v >
 class Linear;

  template<typename x>
  class Queues
  {
    public:

    private:
        struct Nodes{
            int n;
        };
    //Does this mean I am giving Linear class access to all of my Queues class variable or    is it the opposite ? 
    friend class Linear<k,v>;
    };

Queues.cpp

  #include"Queues.h" 

私のエラーは

Queues.h:15: error: `k' was not declared in this scope
Queues.h:15: error: `v' was not declared in this scope
Queues.h:15: error: template argument 1 is invalid
Queues.h:15: error: template argument 2 is invalid
Queues.h:15: error: friend declaration does not name a class or function
4

2 に答える 2

0

最初の質問に答えるには:

クラス内のfriendキーワードにより、フレンド関数またはクラスは、フレンド制約が宣言されているクラスの非公開フィールドにアクセスできます。この言語機能の詳細な説明については、このページを参照してください。

コードのコンパイル エラーについて: この行で:

friend class Linear<k,v>;

kとは何か、どこで定義されているのか自問してください。についても同じですv

基本的に、テンプレートはクラスではなく、「クラスのクラス」を定義できる構文構造です。つまり、テンプレートの場合は次のようになります。

template <typename T>
class C { /* ... */ };

クラスはまだありませんが、適切なタイプ名を指定するとクラスを定義できるようになります。テンプレート内では型名 T が定義されており、実際の型であるかのようにその場で使用できます。

次のコード スニペットでは:

template <typename U> 
class C2 {
   C<U> x;
   /* ... */
};

別のテンプレートを定義します。このテンプレートは、特定の型名でインスタンス化されると、同じ型名を持つテンプレート C のインスタンスを含みます。上記のコードU行の typenameは、インクルードテンプレートによって定義されます。ただし、コードでは、それらが使用されているテンプレートまたは最上位でそのような定義はありません。C<U> x;kv

同じ精神で、次のテンプレート:

template <typename U> 
class C2 {
   friend class C<U>;
   /* ... */
};

インスタンス化されると、クラス テンプレート C のインスタンス(再び同じパラメーター を持つU) がフレンドとして保持されます。私の知る限り、可能なすべてのパラメーターの組み合わせについて、クラス テンプレート インスタンスを特定のクラスとフレンドにすることはできません (C++ 言語はまだ存在型をサポートしていません)。

たとえば、次のように書くことができます。

template<typename x>
class Queues
{
  public:

  private:
     struct Nodes{
        int x;
     };

  friend class Linear<x,x>;
};

Linearの親しみやすさをそのテンプレートのインスタンスのみに制限するには、 xand x、または次のようなものを使用します。

template<typename x,typename k, typename v>
class Queues
{
  public:

  private:
     struct Nodes{
        int x;
     };

  friend class Linear<k,v>;
};

アドリブで定義されることを許可kしたい場合。v

于 2012-11-24T19:56:38.697 に答える
-1

あなたの問題は、そのコードのフレンドクラスではないテンプレートにあります。

Friend は、そのクラスの private および protected へのアクセスに対する制限が削除されていることを意味します。クラスのプライベートという言葉は、基本的にパブリックであるかのように。

1 つの問題で、1 つを除いてすべてを理解しているコードを提出するようにしてください。

于 2012-11-24T19:17:57.403 に答える