48972


C++でpairのqueueを作りたいのですが、単純に書いて`gcc
hoge.cpp`などとするとコンパイルが失敗して次のようなエラーメッセージが出ます。`g++ -std=c++11
hoge.cpp`だとコンパイルが成功します。下部の質問にお答えいただけると助かります。よろしくお願いいたします。

### (A)こうやるとコンパイル失敗する

[code]

    queue<pair<int, int>>Q
    
    # (参考)エラーメッセージ
    hoge.cpp:22:22: error: a space is required between consecutive right angle brackets
          (use '> >')
      queue<pair<int, int>>Q;
                         ^~
    1 error generated.
    
[/code]

### (B)こうやるとコンパイル成功する

[code]

    typedef pair<int, int> P;
    queue<P>Q
    
[/code]

### 質問

  1. どうして(A)だとコンパイルが失敗して、(B)だと成功するのでしょうか？
  2. (A)でも、C++11でコンパイルするとコンパイルが成功するのはどういう仕様追加によるものでしょうか？


CC BY-SA 4.0
2018-10-04T12:35:03.460
48971
2018-10-04T21:51:10.137
2018-10-04T21:51:10.137
4236
29267
question
c++ c++11
C++におけるqueue<pair<int, int>>Qの定義方法について


**_1.どうして(A)だとコンパイルが失敗して、(B)だと成功するのでしょうか？_**

C++11より前のC++の字句解析処理で、`>>`は右シフト演算子としての解釈が優先されていたためです。(A)と(B)の中間で、こんなのはコンパイルが通るはず(エラーメッセージでもそう言ってます)です。

### (A')

[code]

    queue<pair<int, int> >Q
    
[/code]

※空白が1個挟まっているせいで`>>`が右シフト演算子という解釈があり得なくなる。

(B)ではもちろん`>>`なんて出てきませんから、解釈の問題とかは起こらないわけです。

**_2.(A)でも、C++11でコンパイルするとコンパイルが成功するのはどういう仕様追加によるものでしょうか？_**

C++11では、左山括弧としての`<`が直近にある場合、`>`記号が連続しても右山括弧として解釈されるよう構文規則が変更されました。

したがって(A)の場合の`>>`は、C++11では右山括弧が連続しているものとみなされます。


CC BY-SA 4.0
2018-10-04T12:49:56.467
48972
2018-10-04T12:49:56.467
13972
48971
answer