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

    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;
        }