質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2922閲覧

AtCoderで範囲for文や多次元配列がうまく使えない(実行時エラーまたはコンパイルエラーになる)

0kina

総合スコア22

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/04/06 15:18

前提・実現したいこと

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しているコードが有りました。)
しかもそのコードをコピペして提出してもエラーになります。。。

完全に手詰まりなので回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AtCoderのルールではC++14を使用しているとあるので手詰まりになりました。

range-for は C++11 で導入された文法なので、C++03 ではビルドできません。
言語選択のところに C++ と C++14 の2つがありますが、C++14 のほうを選択しましたか?

投稿2020/04/06 15:31

編集2020/04/06 15:32
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0kina

2020/04/06 15:41 編集

C++の方を選んでました。。。 無事ACできました。 迅速な回答ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問