2011-04-02 4 views
1

ヘルプ

typename T::ElementT 

a[i] 

は何を意味しています。このコード

template <typename T> 
typename T::ElementT at (T const &a , T const &b) 
{ 
     return a[i] ; 
} 

を考えると? T:ElementT以来

+0

このコードはどこから入手できますか?それは全く役に立たないようですか?そして、それらのエラーがありました(私は 'const typename T :: ElementT'でなければならないと思いますし、' b''と 'i'')は何ですか? – sbi

答えて

3
typename T::ElementT 

あなたがそれの前にキーワードtypenameを参照してください理由です、依存名です。 ElementTは、タイプであることをコンパイラに伝えています。

については、を書くときに呼び出されるoperator[]を定義したクラスであると思われます。例えば、(部分的に)ここで定義されているようTsample次のようになります。Tsampleであれば今

class sample 
{ 
public: 
     typedef int ElementT; //nested type! 

     //... 

     ElementT operator[](int i) 
     { 
      return m_data[i]; 
     } 

     ElementT *m_data; 
     //... 
}; 

、あなたはタイプTであるT::ElementTなどa[i]を書くことができます。この場合、Tをサンプルとした場合、インデックスiタイプintであると仮定しています。

0

私は、コードTは常に演算子[]がオーバーロードされ、サブクラスDefenition ElementTを持つクラスであると推測します。これらの2つの性質を持たない他のクラスはコンパイル中にエラーを起こします。

0
typename T::ElementT 

これはC++ FAQにthis entryにヨハネスによってexhaustingly説明します。

a[i] 

この操作は通常、 "サブスクリプション" と呼ばれ、aのi番目の要素にアクセスしています。これを行うには、aは配列か、サブスクリプション演算子をオーバーロードするクラス(std::vectorまたはstd::mapなど)でなければなりません。
しかしナワズは、彼のコメントで指摘したように、a以来タイプTのものであり、Tので、配列にすることはできません。この場合aには、ネストされたタイプElementAtが期待されています。

+0

この場合、 'a'の型はネストされた型を持つ' T'なので、 'a'は配列にすることはできません! – Nawaz

+1

@Nawaz:確かに。私はこれを早朝に正しく考えないと思う... – sbi