1

C++ で typename キーワードがどのように使用されているかについてのこの素晴らしい要約を読みました: http://pages.cs.wisc.edu/~driscoll/typename.html

それでも私は特定の例について疑問に思います:

template<typename T> class Outer{
  public:
    class Inner1{
       T t; 
    };
    class Inner2{
      int t; 
    };
};

template<typename T> void foobar(void)
{
  std::list<Outer<T>::Inner1> l;
}

上記のリンクのテキストから、私が必要であることを理解しています

std::list<typename Outer<T>::Inner1> l;

Inner1 は修飾されており、依存しているためです。

しかし: Inner2 には、私を混乱させる型名も必要です: まず、Inner2 が型であることは明らかです (まあ、Inner1 については既に明らかです)。次に、Inner2 は T にまったく依存しません。すべての可能な T について、Inner2 は同じ (タイプ) になります。

テンプレート内から修飾型を使用するとすぐに typedef が必要ですか? テンプレートパラメータに依存するかどうか?

4

2 に答える 2

3

あなたの2番目の仮定は間違っています。各 Outer には別の Inner2 があるため、 Inner2T に依存します。Outer を専門化すると、それが明らかになります。

template<> class Outer<char>{
public:
  class Inner1{
     T t; 
  };
  typedef int Inner2; 
};

そして、あなたが専門でなくOuter<float>::Inner2Outer<long>::Inner2も、同じレイアウト、メンバー、名前などを持っているかもしれませんが、それらは同じタイプではありません! アクセスについて考えてみましょOuter<long>::Inner2う - はOuter<long>のプライベート メンバーにアクセスできますが、アクセスできOuter<float>::Inner2ません。

次の特殊化では、Inner2 は型ではありません。

template<> class Outer<long double>{
public:
  char Inner2(int); 
};
于 2012-12-05T09:41:27.467 に答える
1

Outer<T>::Inner2コンパイラは、それが型なのか静的データメンバーなのかなど、Tどのようなものかを知らないという意味で、型に依存します。Inner2そうです、typenameここでそれがどのようなものかをコンパイラに伝える必要があります。デフォルトでは、それが非型メンバー (静的データ メンバー、メソッド名、enum値など) であると想定されるためです。

(これは C++03 にも当てはまります。これに関する規則は C++11 でも変更されていないと思います。)

于 2012-12-05T09:37:31.070 に答える