C ++-テンプレートでtypenameを使用する方法[転送]



C How Use Typename Template



(転送元: https://blog.csdn.net/caroline_wendy/article/details/23910709?utm_source=blogxgwz2 )。

テンプレートパラメータが宣言されると、プレフィックスキーワードクラスとタイプ名を交換できます



ネストされた依存型名は、キーワードtypenameを使用して識別されますが、基本クラスリストおよびメンバー初期化リストで使用する必要はありません。

依存する名前:テンプレートに表示される名前は、Ttなどのテンプレートパラメータによって異なります。



ネストされた依存名:従属名は、T :: const_iteratorciなどのクラス内にネストされています

非依存名:int値などのテンプレートパラメータの名前に依存しません

タイプ名、ネストされた従属名を指定しない場合、生成することが可能です 解析 あいまいさ。



いつでも テンプレート 中指はネストされた依存型名を参照します。これは前の位置に追加する必要があります。 キーワードtypename

そうでなければ エラーを報告する (GCC):エラー:「T」は依存スコープであるため、「T :: xxx」の前に「typename」が必要です

コード:

/* * BInsertSort.cpp * * Created on: 2014.4.17. * Author: Spike */ #include #include #include using namespace std template void print2nd(const T& container) { Typename T::const_iterator iter(container.begin()) //without typename, error ++iter int value = *iter std::cout << value } int main () { vector vi = {1,2,3,4,5} print2nd(vi) return 0 }

出力:

例外:ネストされた依存型名(はいの場合)基本クラスリスト(基本クラスリスト)とメンバーの初期値列(メンバー初期化リスト)、typenameを使用しません
コード:

/* * BInsertSort.cpp * * Created on: 2014.4.17 * Author: Spike */ #include #include using namespace std struct Number { Number(int x) { std::cout << 'Number = ' << x << std::endl } } template struct Base{ typedef Number Nested } template Class Derived: public Base::Nested { //Do not typename public: Explicit Derived(int x) : Base::Nested(x) { //Do not typename Typename Base::Nested temp(7) //Must be used } } int main () { Derived d(5) return 0 }

出力:
数= 5
数= 7

トレイトクラスを使用する場合は、次のようなtypenameを使用する必要があります。
コード:

/* * BInsertSort.cpp * * Created on: 2014.4.17 * Author: Spike */ #include #include using namespace std template void workWithIter(T iter) { Typedef typename std::iterator_traits::value_type value_type //use typename value_type temp(*iter) std::cout << 'temp = ' << temp << std::endl } int main () { std::array ai = {1,2,3,4,5} std::array::iterator aiIter = ai.begin() workWithIter(aiIter) return 0 }

出力:
温度= 1