47864


for文の場所でこのようなコンパイルエラーが出ます。  
[重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態  
エラー C2760 構文エラー: トークン '識別子' は予期されておらず、';' が予期されています main.cpp 18行]  
再度確認しプロジェクトを作り直したりソフトの再起動もしましたがエラーがとれません。  
参考書は明解c++中級編です。環境はWindows10 visual studio 2017です  
hello
worldを実行して文字を表示したりしてるのでプロジェクトの作り間違えの可能性はないと思います、またヘッダーやソースファイルもmain.cppしか作ってないのでやはり構文エラーだと思うのですがやはりわかりません。教えていただけますでしょうか。？

[code]

    #include "conio.h"
    //#include <iomanip>
    #include <string>
    #include <iostream>
    #include <vector>
    using namespace std;
    
    
    
    template <class T, class Allocator>
    void print_vector(const vector<T, Allocator>& v)
    {
        cout << "{ ";
                              /*この行です↓*/
        for (vector<T,Allocator>::size_type i = 0; i != v.size(); i++)
        {
            cout << v[i] <<" ";
        }
        cout << '}';
    }
    
    int main()
    {
        int a[] = { 1, 2, 3, 4, 5 };
        vector<int> x(a, a + sizeof(a) / sizeof(a[0]));
    
        double b[] = { 3.5, 7.3, 2.2, 9.9 };
        vector<double> y(b, b + sizeof(b) / sizeof(b[0]));
    
        string c[] = { "abc", "WXYZ", "123456" };
        vector<string> z(c, c + sizeof(c) / sizeof(c[0]));
    
        cout << "x = ";   print_vector(x);   cout << '\n';
        cout << "y = ";   print_vector(y);   cout << '\n';
        cout << "z = ";   print_vector(z);   cout << '\n';
    
        _getch();
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2018-08-27T14:21:52.177
47860
2018-08-28T07:11:01.917
2018-08-28T07:11:01.917
76
question
c++
原因のわからないコンパイラエラーメッセージ


Visual C++は[コンパイルオプション`/permissive`](https://docs.microsoft.com/en-
us/cpp/build/reference/permissive-standards-
conformance)で次の２つの構文パーサを切り替えて選択することができます。

  * 従来互換でC++標準に準拠しない構文パーサ（`/permissive`もしくは未指定）
  * C++標準に準拠した構文パーサ（`/permissive-`）

コンパイラそのものは前者がデフォルトですが、Visual Studio 2017 version
15.5以降を使用してプロジェクトを新規に作成した場合に後者が選択されるようあらかじめ構成されています。

プロジェクトの設定を変更しコンパイルオプション`/permissive-`を無効化することで従来互換の構文パーサが有効になり、件のエラーは指摘されなくなります。  
想像ですが、著者はC++標準を知らないままテキトーに書籍を執筆されたものと思われます。

正しくはmetropolisさんがコメントされているように、以下のように`typename`キーワードが必要です。`typename`キーワードを追加した場合は、`/permissive`、`/permissive-`どちらの構文パーサを使用してもコンパイルに成功します。

[code]

    for (typename vector<T,Allocator>::size_type i = 0; i != v.size(); i++)
    {
        cout << v[i] <<" ";
    }
    
[/code]

* * *

なお今時であれば、挙げられているような面倒なコードは書かず、[C++11](https://cpprefjp.github.io/lang/cpp11.html)の[範囲for文](https://cpprefjp.github.io/lang/cpp11/range_based_for.html)と[`auto`](https://cpprefjp.github.io/lang/cpp11/auto.html)の機能を使用して

[code]

    for (auto const& val : v)
        cout << val << " ";
    
[/code]

と書きます。

勉強されるのでしたら、標準に準拠した、時代に即した書籍を参照されることをお勧めします。  
そうでない場合、まず著者の指定するコンパイラを使用するべきです。また質問の際にいつの時代について取り扱いたいのかを明示していただく必要があります。例えば、[別スレッド](https://ja.stackoverflow.com/questions/47855/%E9%85%8D%E5%88%97%E3%81%AEsizeof#comment49361_47855)でmetropolisさんが`std::end()`を提案されていますがVisual
C++で`std::end()`が使えるのは[Visual Studio 2012以降](https://docs.microsoft.com/en-
us/previous-versions/visualstudio/visual-
studio-2012/jj190751\(v%3Dvs.110\))となります。2012未満を前提に書かれた書籍を参考にされた場合は`std::end()`は登場せず混乱することでしょう。


CC BY-SA 4.0
2018-08-27T21:56:56.423
47864
2018-08-28T02:19:38.070
2018-08-28T02:19:38.070
4236
4236
47860
answer