前提・実現したいこと
AtCoderで範囲for文や多次元配列を使ってもエラーが出ないようにしたい。
発生している問題・エラーメッセージ
APG4BのEX20 - 報告書の枚数の解答として以下のプログラムを提出したところ、次のようなエラーメッセージがでてコンパイルエラーとなりました。
./Main.cpp:6:39: error: ‘>>’ should be ‘> >’ within a nested template argument list int count_report_num(vector<vector<int>> &children, int x) { ^ ./Main.cpp: In function ‘int count_report_num(std::vector<std::vector<int> >&, int)’: ./Main.cpp:12:17: warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11 for (int i: children.at(x)) { ^
該当のソースコード
c++
1#include <bits/stdc++.h> 2using namespace std; 3 4// x番の組織が親組織に提出する枚数を返す 5// childrenは組織の関係を表す2次元配列(参照渡し) 6int count_report_num(vector<vector<int>> &children, int x) { 7 // (ここに追記して再帰関数を実装する) 8 if (children.at(x).size() == 0) { 9 return 1; 10 } else { 11 int report_num = 1; 12 for (int i: children.at(x)) { 13 report_num += count_report_num(children, i); 14 } 15 return report_num; 16 } 17} 18 19// これ以降の行は変更しなくてよい 20 21int main() { 22 int N; 23 cin >> N; 24 25 vector<int> p(N); // 各組織の親組織を示す配列 26 p.at(0) = -1; // 0番組織の親組織は存在しないので-1を入れておく 27 for (int i = 1; i < N; i++) { 28 cin >> p.at(i); 29 } 30 31 // 組織の関係から2次元配列を作る 32 vector<vector<int> > children(N); // ある組織の子組織の番号一覧 33 for (int i = 1; i < N; i++) { 34 int parent = p.at(i); // i番の親組織の番号 35 children.at(parent).push_back(i); // parentの子組織一覧にi番を追加 36 } 37 38 // 各組織について、答えを出力 39 for (int i = 0; i < N; i++) { 40 cout << count_report_num(children, i) << endl; 41 } 42}
試したこと
1つ目のエラーについては、stackoverflowの記事(Error in nested template argument when compile c++ in unix
)によると、C++11より前の仕様で発生するとあるのですが、AtCoderのルールではC++14を使用しているとあるので手詰まりになりました。
2つ目のエラーについては、見た感じAtCoderが設定しているコンパイルオプションが範囲for文の使えないものなのかとも思いましたが、同じ問題の提出一覧には範囲for文を使っていてACしているものもありました。(これは1つ目のエラーについても同様で、ACしているコードが有りました。)
しかもそのコードをコピペして提出してもエラーになります。。。
完全に手詰まりなので回答よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/06 15:41 編集