47954


(参考書:明解c++中級編425ページ)  
参考書のほうで`class`と`typename`についての言葉の違いの説明がなく混乱しているので説明をお願いしたいです、ググりましたがいろんなことを言っているサイトがあってどれがほんとなのかわかりません。`class`と`typename`のどちらも使い方が同じというサイトもあるので混乱しています。  
また、`for`文に`typename`という記述を入れないとエラーになるのですがどうしてでしょうか？  

[code]

        template<typename allocator>
            void put_string_vector(const vector<string, allocator>& v)
            {
                cout << "{";
                for (typename vector<string, allocator>::size_type i = 0; i < v.size(); i++) {
                    cout << " ";
                    for (typename vector<string, allocator>::size_type j = 0; j < v[i].length(); j++) {
                        cout << v[i][j];
                    }
                    cout << "\" ";
                }
                cout << "}";
            }
    
            int main()
            {
                vector<string> s1(3);
                vector<string> s2;
    
                s2.push_back("ABC");
                s2.push_back("123");
                s2.push_back("XYZ");
    
                cout << " s1 =";
                put_string_vector(s1);
                cout << "\n";
    
                cout << "s2 = ";
                put_string_vector(s2);
                cout << "\n";
    
    
    
                _getch();
                return 0;
            }
    
[/code]


CC BY-SA 4.0
2018-08-30T12:30:41.800
47944
2018-08-31T04:57:25.997
2018-08-31T04:57:25.997
24284
question
c++
c++、テンプレートのtypenameとclassの違いについて知りたい


> テンプレートのtypenameとclass違いついて知りたい

  * 1) テンプレートパラメータの宣言（`template <～>`の中身）においては、`typename` と `class` の違いはありません。全く同じ意味になります。
  * 2) テンプレートを使うときに、`typename` キーワードが必要になるケースがあります（後述）

簡単にまとめると「テンプレートで使うのは `typename` だけ」と考えておけば安心です。

* * *

> またfor文のtypenameは入れないとエラーになるのですがどうしてしょうか？

for文の構文としては下記の通りで、 _XXX_ 箇所には型の名前が要求されます。

[code]

    for (XXX i = 0; i < v.size(); i++) { ... }
    
[/code]

具体的な型としては `vector<string, allocator>::size_type` を指定したいのですが、このタイミングではC++コンパイラは
`～::size_type` が「型の名前」なのか「変数の名前」なのかを判断できず(※)、プログラマが `typename`
キーワードを明示して「これは型の名前ですよ」とC++コンパイラに伝える必要があります。

~~もしC++11以降に対応したC++コンパイラを使っているならば、単に`auto` とだけ書けばOKです。~~  
（`auto i = 0`ではint型に推論されてしまうため、インデクスループに対しては利用推奨しません。）

※ C++言語仕様上は、型名／変数名を判断できないときは変数名を優先するというルールがあり、`typename`
が無いときは変数名と判断してコンパイルエラーになります。


CC BY-SA 4.0
2018-08-31T01:49:24.897
47954
2018-08-31T03:54:16.087
2018-08-31T03:54:16.087
49
49
47944
answer