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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

Q&A

解決済

1回答

4071閲覧

エラーの意味を教えてください 「2引数を取り込む関数には評価されません」

nonoilaoziso

総合スコア19

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

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

0グッド

0クリップ

投稿2021/01/16 03:33

Atcoder dp_c (https://atcoder.jp/contests/dp/tasks/dp_c) において以下のプログラムを書きました。再起関数でDPを行おうとしたのですが、Visual Studio でビルドを行うと、utility 33行目「2引数を取り込む関数には評価されません」と、エラーが出ます。chmax の使い方に問題があるのだと思いますが、utility ファイルを見てもよく分からなかったので、このエラーは何が原因で、どうすれば治るのかを教えてください。

utilityファイルの33行目前後

_STD_BEGIN // FUNCTION TEMPLATE max template <class _Ty, class _Pr> _NODISCARD constexpr const _Ty&(max)(const _Ty& _Left, const _Ty& _Right, _Pr _Pred) noexcept( noexcept(_Pred(_Left, _Right))) /* strengthened */ { // return larger of _Left and _Right return _Pred(_Left, _Right) ? _Right : _Left; }

コード

C++

1#include <bits/stdc++.h> 2#define _GLIBCXX_DEBUG 3#define rep(i, n) for (int i = 0; i < (int)(n); i++) 4#define rep2(i, s, n) for (int i = (s); i < (int)(n); i++) 5#define all(v) v.begin(), v.end() 6#define pb push_back 7#define sz(x) ((int)(x).size()) 8typedef long long ll; 9using namespace std; 10using Graph = vector<vector<int>>; 11template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; } 12template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; } 13const ll INF = 1LL << 60; 14 15int N; vector<ll> a, b, c; vector<vector<ll>> dp(3); 16 17ll rec(int x, int n) { 18 if (dp[x][n] != -1) return dp[x][n]; 19 20 ll res = 0; 21 22 if (x == 0) { 23 chmax(res, rec(1, n - 1) + a[n - 1]); 24 chmax(res, rec(2, n - 1) + a[n - 1]); 25 } 26 if (x == 1) { 27 chmax(res, rec(0, n - 1) + b[n - 1]); 28 chmax(res, rec(2, n - 1) + b[n - 1]); 29 } 30 if (x == 2) { 31 chmax(res, rec(0, n - 1) + c[n - 1]); 32 chmax(res, rec(1, n - 1) + c[n - 1]); 33 } 34 35 return dp[x][n] = res; 36} 37 38int main() { 39 cin.tie(0); 40 ios::sync_with_stdio(false); 41 42 cin >> N; a = b = c = vector<ll>(N); rep(i, N) cin >> a[i] >> b[i] >> c[i]; 43 44 dp = vector<vector<ll>>(3, vector<ll>(N + 1, -1)); dp[0] = { 0, 0, 0 }; 45 46 cout << max(rec(0, N), rec(1, N), rec(2, N)) << "\n"; 47 48 return 0; 49}

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1 cout << max(rec(0, N), rec(1, N), rec(2, N)) << "\n";

3引数のmax()は、比較する値2つと、その2つを比較する比較関数を渡す仕様になっています(参考の(2))。
本来2引数の比較関数を渡すべきところにrec(2, n)を渡しているので、
この引数が「2引数を取り込む関数には評価されません」と怒られているわけです。

max()には、initializer_listを受け取るものもあるので(参考の(3))、そちらを使いましょう。

C++

1 cout << max({ rec(0, N), rec(1, N), rec(2, N) }) << "\n";

参考 : max - cpprefjp C++日本語リファレンス

投稿2021/01/16 03:58

編集2021/01/16 05:09
actorbug

総合スコア2431

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問