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

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

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

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

Q&A

解決済

2回答

850閲覧

Template使用時、ConstructorのArgumentsについて

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/02/08 03:26

編集2019/02/08 03:56

C++の入門者で、template,classの使い方について学んでいます。
下記末尾に例示のcodingで、constructorを

//Constructor // This does not work right. Cal() :a(1), b(1) {}

とするとfloatに対応しないのでダメなようす。

それで、

//Constructor Cal(T pa, T pb) :a(pa),b(pb){} //This works good.

または

//Constructor Cal(T pa, T pb) { a = pa; b = pb;} //This works good too.

としてT型を明示して代数を代入すると良いことが分かりました。
しかし、この代数では実数でないので、initialize 出来ないのではないかと疑問がわきました。この場合は実数が入らなくても initialize 可能なのですか?

これはどう理解したらよいのかご案内お願いします。

//Sample coding: template <class T> class Cal { T a, b; public: Cal(T pa, T pb) :a(pa),b(pb){} //This works good. void get() { cout << "Type values of members." << endl; cin >> a >> b; } void cal_add() {cout << a << " + " << b <<" = "<< a+b << endl;} void cal_subtra() { cout << a << " - " << b << " = " << a - b << endl; } void cal_multi() { cout << a << "x " << b << " = " << a * b << endl; } void cal_div() { cout << a << " / " << b << " = " << a / b << endl; } }; int main() { int temp_a=1, temp_b=2; float temp_fa=1.1, temp_fb=2.2; Cal <int> int_test(temp_a, temp_b); Cal <float> flt_test(temp_fa, temp_fb); int_test.get(); int_test.cal_add(); int_test.cal_subtra(); int_test.cal_multi(); int_test.cal_div(); return 0; }

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

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

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

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

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

t_obara

2019/02/08 03:59

「この代数ではinitialize出来ないのではないか」とはどのような意味かわかりませんでした。もう少し具体的な事例をご提示いただけないでしょうか。
退会済みユーザー

退会済みユーザー

2019/02/08 06:02

お世話になります。maisumakunさんが書いてくれたような内容です。Initializeするのに数字を入れないと出来ないのだ、と覚えてきたので、 Cal(T pa, T pb) { a = pa; b = pb;} というようにaに代入して、なぜ不安定にならないのかが分かりませんでした。
guest

回答2

0

こんにちは。

とするとfloatに対応しないのでダメなようす。

やってみましたが、特に問題ないようですよ。何がどうダメなのか具体的に(どのような動作を期待しているが、どのように動作する)書きましょう。

投稿2019/02/08 03:59

Chironian

総合スコア23272

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

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

退会済みユーザー

退会済みユーザー

2019/02/08 06:09

お世話になります。 public: Cal() :a(1), b(1) {} Cal(T pa, T pb) :a(pa),b(pb){} //This works good. の真ん中のConstructorだけではダメだった、と見たのですが、どうもerror messageの読み違いのようでした。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/02/08 06:12

追伸 ご丁寧に実行していただき、ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/02/08 06:28

Chironianさん、やっぱり真ん中のConstructorが一つだけだと、 main()の Cal <int> int_test(temp_a, temp_b); のところで、 「::Cal': 2 個の引数を伴うオーバーロードされた関数はありません。」 とエラーになります。 呼び出し側で2個Argumentsをいれるから、Constructorでも2個にあわせないといけないのですね。
Chironian

2019/02/08 06:40

その通りです。 通常のメンバ関数の場合も同じですね。呼び出し時の実引数に該当する関数が定義されていないと、そのようなエラーがでます。
退会済みユーザー

退会済みユーザー

2019/02/08 07:25

了解しました。 いつもありがとうございます。
guest

0

ベストアンサー

この場合は実数が入らなくても initialize 可能なのですか?

はい、Tint型でも、ゼロ除算やオーバーフローなどの問題を置いておくとすれば、それ以外ではコンパイルに失敗するような要因もなく、このクラスは動作します。

投稿2019/02/08 03:58

編集2019/02/08 04:00
maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2019/02/08 06:11

お世話になりました。なんとなくわかりました。またお伺いします。よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問