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

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

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

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

Q&A

解決済

1回答

6503閲覧

C++ 関数の引数がおかしい? コンパイルエラーの原因が分からない

opyon

総合スコア1009

C++

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

0グッド

0クリップ

投稿2018/11/07 03:15

編集2018/11/07 03:21

###知りたいこと
エラーが起きている原因と解決方法などで気づいたことなどあればご教示頂けると助かります。

###現状
AOJの問題:マージソート:ALDS1_5_B

上記問題の疑似コードをC++で写経しながら実装したのですが
merge(vec, left, mid, right);
この部分でコンパイルエラーerror: no matching functionが起きています。

エラーから引数の指定方法や参照方法に問題がありそうなのですが・・・
引数は(配列,整数,整数,整数)で全て同じ型を使用してるし個数も順番も合っているのに何が間違っているのか分かりません。

表記を短くする為に質問用も兼ねて(unsigned long long)型を全て(int)型に変更してもみても同じエラーが出るので型の問題では無さそうです。

###エラー

c:\workvs\qa.cpp:13:36: error: no matching function for call to 'merge(std::vector<int>&, int&, int&, int&)' merge(vec, left, mid, right);

エラー画像
###サンプルコード

C++

1#include <bits/stdc++.h> 2const int INF = 2.19e15 + 1; 3 4void mergeSort(std::vector<int> vec, int left, int right) 5{ 6 int mid; 7 if (left + 1 < right) 8 { 9 mid = (left + right) / 2; 10 mergeSort(vec, left, mid); 11 mergeSort(vec, mid, right); 12 merge(vec, left, mid, right); 13 } 14} 15 16void merge(std::vector<int> vec, int left, int mid, int right) 17{ 18 int n1 = mid - left; 19 int n2 = right - mid; 20 21 std::vector<int> L(n1); 22 std::vector<int> R(n2); 23 24 for (int i = 0; i < n1 - 1; ++i) 25 { 26 L[i] = vec[left + i]; 27 } 28 L[n1] = INF; 29 30 for (int i = 0; i < n2 - 1; ++i) 31 { 32 R[i] = vec[mid + i]; 33 } 34 R[n2] = INF; 35 36 int i = 0; 37 int j = 0; 38 for (int k = left; k < right - 1; ++k) 39 { 40 if (L[i] <= R[j]) 41 { 42 vec[k] = L[i]; 43 i = i + 1; 44 } 45 else 46 { 47 vec[k] = R[j]; 48 j = j + 1; 49 } 50 } 51} 52 53void alds1_5_2() 54{ 55 std::vector<int> vec({2, 5, 3, 1, 4}); 56 mergeSort(vec, 0, vec.size()); 57 // prt(vec); 58} 59 60int main() 61{ 62 alds1_5_2(); 63 getchar(); 64 return 0; 65} 66

作成途中ですが期待する出力は入力した配列の昇順ソートです

1 2 3 4 5

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++のソースコードは上から順に処理されますので、mergeSortを処理する段階では、まだmergeがなく、この関数の定義が不明な状態となります。

対処法は2つあります。

  • mergeを上に持ってくる
  • mergeSortより上で、void merge(std::vector<int> vec, int left, int mid, int right);のように関数プロトタイプを宣言しておく

投稿2018/11/07 03:19

maisumakun

総合スコア145184

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

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

opyon

2018/11/07 03:23

回答ありがとうございます。 初歩的なミスで失礼しました^^;
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問