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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

Q&A

解決済

1回答

1086閲覧

テンプレートクラスを利用し、あらゆる型で処理ができるクラスcollectionを作る。

takuan1205

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

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

0グッド

0クリップ

投稿2020/04/20 04:41

前提・実現したいこと

現在C++を学習しており、テンプレートを利用してソースを書きました。
実行結果自体は正しいのですが、コンパイル時に出てしまう警告を解消したい為質問致しました。
ソースは、collection.h、main.cppです。

以下のサイトのproblex3-2について質問致します。
http://cpp-lang.sevendays-study.com/problemex3.html

以下問題文転載。↓
以下のプログラムでのクラスCollectionIntは、整数型の配列を保持し、その中から最大値と最少値を取得できるクラスである。このクラスをテンプレートを使って、double,stringなど、あらゆる型で同じ処理ができるクラス、collectionを作り、処理を書き換えなさい。

期待される実行結果
実数の場合
1.2 3.5 8.1 4.9 2.0 2.2
最大値 : 8.1
最小値 : 1.2

整数の場合
1 5 4 2 3
最大値 : 5
最小値 : 1

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

In file included from main.cpp:2:
./Collection.h:52:5: warning: control reaches end of non-void function
[-Wreturn-type]
}
^
main.cpp:10:8: note: in instantiation of member function
'Collection<double>::showArray' requested here
c->showArray();
^
1 warning generated.

該当のソースコード

C++

1#ifndef _COLLECTION_H_ 2#define _COLLECTION_H_ 3#include <iostream> 4 5using namespace std; 6 7template<typename T>class Collection{ 8private: 9 // 配列データ 10 T* m_pArray; 11 // 配列の長さ 12 int m_length; 13public: 14 // コンストラクタ 15 Collection(T* array,int length){ 16 m_pArray = new T[length]; 17 m_length = length; 18 for(int i = 0; i < m_length ; i++){ 19 m_pArray[i] = array[i]; 20 } 21 }; 22 // デストラクタ 23 ~Collection(){ 24 delete[] m_pArray; 25 }; 26 // 最大値の取得 27 T getMax(){ 28 T max = m_pArray[0]; 29 for(int i = 0; i < m_length ; i++){ 30 if(max < m_pArray[i]){ 31 max = m_pArray[i]; 32 } 33 } 34 return max; 35 }; 36 // 最小値の取得 37 T getMin(){ 38 T min = m_pArray[0]; 39 for(int i = 0; i < m_length ; i++){ 40 if(min > m_pArray[i]){ 41 min = m_pArray[i]; 42 } 43 } 44 return min; 45 }; 46 // 成分の表示 47 T showArray(){ 48 for(int i = 0; i < m_length ; i++){ 49 cout << m_pArray[i] << " "; 50 } 51 cout << endl; 52 } 53}; 54 55#endif // _COLLECTION_H_ 56

C++

1#include <iostream> 2#include "Collection.h" 3 4using namespace std; 5 6int main(){ 7 // 配列変数の定義 8 double array[] = { 1.2,1.1,8.1,8.2,3.6 }; 9 Collection<double>* c = new Collection<double>(array,5); 10 c->showArray(); 11 cout << "最大値 : " << c->getMax() << endl; 12 cout << "最小値 : " << c->getMin() << endl; 13 delete c; 14 return 0; 15} 16

試したこと

テンプレートの呼び出し方が誤っているのではと考え、main.cpp7行目の
Collection<double>* c = new Collection<double>(array,5);

Collection* c = new Collection<double>(array,5);

Collection<double>* c = new Collection(array,5);
としましたが、エラーは出たままでした。

また、インスタンス生成が誤ってるのではと考え2行に分けて
Collection<double>* c;
c = new Collection<double>(array,5);
と書いてもやはり警告は発生しました。

実行時のコマンドは
g++ -c main.cpp -o main.o ←これを行うと警告が発生する。
g++ main.o
./a.out
です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

(1) 変なところにセミコロンがついてます(他の場所も)

}; <--- NG // デストラクタ

(2) showArrayreturn文がありません。戻り値の型をvoidにしましょう

NG T showArray(){ OK void showArray(){

投稿2020/04/20 04:57

編集2020/04/20 05:07
yuki23

総合スコア1448

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

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

yuki23

2020/04/20 05:11

質問とは関係ありませんが、ヘッダーファイルの中で using namespace std; するのは禁じ手です。絶対やめましょう
takuan1205

2020/04/20 09:38 編集

迅速な回答ありがとうございます。 回答の通りに直しました。 クラスの最後のカッコのみは }; とするのですね。また、戻り値voidに関しても理解致しました。 using namespace std; に関してもアクセス修飾子が衝突することにより、バグの原因になるとのことで書いてはいけないと出てきたので、 using namespace std; の部分を削除し、std::cout std::endl とした所、無事エラーなくコンパイルが通る様になりました。 そこで質問なのですが、using namespace std を std:: と書くのは合っているのでしょうか。私の中でいまいち理解がなってなくて、、 質問の主旨とは異なりますが、教えていただけると幸いです。
yuki23

2020/04/20 10:13

> std:: と書くのは合っているのでしょうか はい、それでOKです。 ソースファイルで using namespace std; するのも黒に近いグレーなのですが、一つのソースファイルを完全に掌握できているなら許容できる場合もあります。しかし、ヘッダーファイルとは複数のソースファイルで使うためのものなので、using namespace すると他のソースファイルに迷惑をかけます。なのでヘッダーファイルで使ってはいけません。
takuan1205

2020/04/20 10:27

ありがとうございました。問題の根本だけでなく、 using namespaceに関してのアドバイスも非常に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問