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

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

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

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

Q&A

解決済

1回答

10796閲覧

C++の継承時に"no matching function for call to"エラーが出る

EIP

総合スコア13

C++

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

0グッド

0クリップ

投稿2018/08/15 14:20

前提・実現したいこと

C++であるクラスを継承したクラスを呼び出そうとするとエラーが出ます。
ロベールのC++教室(http://www7b.biglobe.ne.jp/~robe/cpphtml/)を参考にしています。

何が原因なのでしょうか。

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

..\src\class2.cpp: In function 'int main()': ..\src\class2.cpp:117:22: error: no matching function for call to 'CIntArray2::CIntArray2(int)' CIntArray2 array2(50); ^ ..\src\class2.cpp:83:7: note: candidate: CIntArray2::CIntArray2(const CIntArray2&) class CIntArray2: public CIntArray{ ^~~~~~~~~~ ..\src\class2.cpp:83:7: note: no known conversion for argument 1 from 'int' to 'const CIntArray2&' ..\src\class2.cpp:83:7: note: candidate: CIntArray2::CIntArray2(CIntArray2&&) ..\src\class2.cpp:83:7: note: no known conversion for argument 1 from 'int' to 'CIntArray2&&'

該当のソースコード

cpp

1class CIntArray{ 2protected: 3 int *pArray; 4 int nSize; 5 void CheckIndex(const int index) const{ 6 if((unsigned int)index < (unsigned int)nSize) 7 return; 8 9 cout << "Error: Invalid Index Number: " << index << endl; 10 exit(1); 11 } 12 13public: 14 CIntArray(const int Size){ 15 pArray = new int[Size]; 16 if(pArray == NULL){ 17 nSize = 0; 18 } 19 else{ 20 nSize = Size; 21 memset(pArray, 0, Size * sizeof *pArray); 22 } 23 cout << endl << "Constructor Called." << endl; 24 } 25 26 CIntArray(const CIntArray &cintarray){ 27 if(cintarray.success() == false){ 28 pArray = NULL; 29 nSize = 0; 30 } 31 else{ 32 pArray = new int[cintarray.size()]; 33 if(pArray == NULL){ 34 nSize = 0; 35 return; 36 } 37 memcpy(pArray, cintarray.pArray, cintarray.whole_size()); 38 nSize = cintarray.nSize; 39 } 40 cout << endl << "Copy Constructor Called" << endl; 41 } 42 43 ~CIntArray(){ 44 if(pArray != NULL){ 45 delete[] pArray; 46 } 47 cout << endl << "Deconstructor Called" << endl; 48 } 49 50 bool success() const{ 51 return pArray != NULL; 52 } 53 54 int get(const int index)const{ 55 CheckIndex(index); 56 return pArray[index]; 57 } 58 59 void set(const int index, const int value){ 60 CheckIndex(index); 61 pArray[index] = value; 62 } 63 64 int size() const{ 65 return nSize; 66 } 67 68 int whole_size() const{ 69 return nSize * sizeof *pArray; 70 } 71}; 72 73class CIntArray2: public CIntArray{ 74public: 75 float average() const{ 76 int sum = 0; 77 float size = nSize * 1.0; 78 for(int i=0; i < nSize; i++){ 79 sum += pArray[i]; 80 } 81 return sum / size; 82 } 83}; 84 85 86void Disp(CIntArray array){ 87 for(int k=0; k < array.size(); k++){ 88 cout << array.get(k) << ", " << flush; 89 } 90} 91 92void Disp2(CIntArray2 array){ 93 for(int k=0; k < array.size(); k++){ 94 cout << array.get(k) << ", " << flush; 95 } 96} 97 98 99int main(){ 100 CIntArray array('Z' - 'A' + 1); 101 102 for(int i=0; i < array.size(); i++){ 103 array.set(i, 'A' + i); 104 } 105 Disp(array); 106 107 CIntArray2 array2(50); 108 109 for(int i=0; i < array2.size(); i++){ 110 array2.set(i, i); 111 } 112 Disp2(array2); 113 cout << array2.average() << endl; 114} 115

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージに原因が書かれています。

..\src\class2.cpp: In function 'int main()':

どうやらmain関数でエラーが発生したようです。

..\src\class2.cpp:117:22: error: no matching function for call to 'CIntArray2::CIntArray2(int)'

CIntArray2::CIntArray2(int)呼び出しにマッチする関数がありません」というようなことを言っています。

CIntArray2 array2(50);

この行でエラーが発生したようです。

要するに、CIntArray2クラスにint値を渡せるコンストラクタが無いということです。

おそらく、基本クラスであるCIntArrayクラスにはint値を引数とするコンストラクタが定義されているので、そちらを呼ぶことを期待しているのだと思いますが、C++では派生クラスにもコンストラクタを定義してやらないといけないことになっています。

方法は二つあります。

① 基本クラスと同じコンストラクタを定義し、初期化リストで基本クラスのコンストラクタを呼び出す。

c++

1class CIntArray2: public CIntArray{ 2public: 3 CIntArray2(const int Size) 4 : CIntArray(Size) {}

② 基本クラスのコンストラクタを丸ごと継承する。

c++

1class CIntArray2: public CIntArray{ 2public: 3 using CIntArray::CIntArray;

エラーメッセージは他にも出ているようですが、上記のいずれかの対応でエラーは出なくなるはずです。一つのエラーが連鎖して複数のエラーメッセージを出力することは、C++ではよくあることです。

投稿2018/08/15 14:54

catsforepaw

総合スコア5938

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問