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

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

新規登録して質問してみよう
ただいま回答率
85.48%
g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

C++

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

Q&A

解決済

3回答

909閲覧

c++でstructの使い方が分かりません

drinksun

総合スコア1

g++

g++はGNUコンパイラコレクション(gcc)のC++コンパイラーです。

C++

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

0グッド

0クリップ

投稿2022/07/13 08:12

前提

c++で競技プログラミングの勉強をしています。
構造体(struct)についての勉強中でプログラムをコンパイルすると、
エラーメッセージが発生しました。

PC関連に疎い部分が多いので、
足りない情報があれば言ってください(参照の仕方も教えていただけると幸いです)

実現したいこと

  • structの中身をできるだけいじらずにエラーを回避したい
  • 自身の環境に問題がありそうだが、それが何か見当がつかない

発生している問題・エラーメッセージ

try.cpp: In function ‘int main()’: try.cpp:35:7: error: missing template arguments before ‘RM’ 35 | RMQ RM(3);

該当のソースコード

c++

1#include <bits/stdc++.h> 2using namespace std; 3/*#define rep(i, n) for (int i = 0; i < (int)(n); i++) 4#define rep1(i, n) for (int i = 1; i < (int)(n+1); i++) 5using ll = long long; 6using P = pair<int,int>; 7using Graph = vector<vector<int>>;*/ 8 9const int mod = 998244353; 10 11//int n; 12 13template <typename T> 14struct RMQ { 15 const T INF = numeric_limits<T>::max(); 16 int n; 17 vector<T> dat, lazy; 18 RMQ(T n_) : n(), dat(n_ * 4, INF), lazy(n_ * 4, INF) { 19 cout << n << endl; 20 int x = 1; 21 while (n_ > x) x *= 2; 22 n = x; 23 cout << n << endl; 24 } 25}; 26 27 28int main() { 29 // cin >> n; 30 31 int ans = 0; 32 33 // cout << ans << endl; 34 35 RMQ RM(3); 36 37 return 0; 38}

試したこと

競技プログラミングサイト(Atcoder)上のコードテストでは、
プログラムを動かすことができた。

補足情報(FW/ツールのバージョンなど)

  • WSL2上でUbuntu 20.04.4 LTS を動かしている
  • エディターはVSCode
  • g++ 9.4.0

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

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

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

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

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

guest

回答3

0

try.cpp のコンパイル時に -std=c++17 オプションをつけて下さい。
例 : g++ -std=c++17 try.cpp

クラステンプレート (今回は template <typename T> struct RMQ) を一つの型として扱う際には、基本的に RMQ<int> RM(3); のようにテンプレート実引数 (ここでは int) を渡してテンプレート仮引数を決定する必要があります。
しかし C++17 と呼ばれる C++ のバージョンからはそういったクラステンプレートのテンプレート仮引数を、変数宣言における初期化で使われる式などから推定する機能が加わり、RMQ RM(3); のように書いても RM の型が RMQ<int>であると推定されるようになりました。

GCC のバージョンが 11.1 未満である場合、オプション無しでコンパイルすると C++ のバージョンが C++14 (C++17 のひとつ前) と呼ばれるものになるため先に挙げた機能が使えず、提示されたようなエラーが出てしまいます。
AtCoder のジャッジ環境において元のコードが正常にコンパイルされるのは、あちらの環境では ソースコードが C++17 として (正確には GNU 拡張も含みますが) コンパイルされるようにオプションが設定されているからです。

投稿2022/07/13 10:20

yaito3014

総合スコア176

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

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

drinksun

2022/07/14 09:49

非常に丁寧な説明ありがとうございます! そのような仕様があったのですね、勉強になりました
guest

0

g++9.4 はデフォルトではC++17の機能は有効ではない気がします。
-std=c++17
オプションをつけてみたらどうなりますか?

テンプレートパラメータのコンストラクタ引数からの推論はC++17以降の機能です。
https://cpprefjp.github.io/lang/cpp17/type_deduction_for_class_templates.html

投稿2022/07/13 10:11

Squirrels

総合スコア22

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

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

drinksun

2022/07/14 09:48

コンパイルの際に入力したら、問題なく動きました。 ありがとうございます!
guest

0

ベストアンサー

missing template arguments

って言われているんだから,template引数を書けばよいのでは.

RMQ<int> RM(3); //実際,intで良いのかは知らんけども

投稿2022/07/13 09:27

fana

総合スコア11654

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

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

drinksun

2022/07/14 09:47

そのように変更したら、コンパイルでき、プログラムを動かすことができました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問