こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

演算子オーバーロードのプログラムで

今、C++でテンプレートクラスや演算子オーバーロードを使ったプログラムの練習をしているのですが、どうしてもうまく動かなく質問させてもらうことにしました。
大まかに言えば、int型のvalueを持ったDataというクラスを用意し、演算子+と-のオーバーロードによって、クラスの足し算引き算を可能にしよう。ということなのですが、
それぞれのオーバーロードした演算子ともに、addSubtractという+と-両方に対応した関数を呼ぶことで使おうと思っています。
コードは以下のようになっています。

1 #include <iostream>
2
3 using namespace std;
4
5 template<class Comparable>
6 class Data {
7  public:
8   Data(){value = 0;}
9   Data(int i){value = i;}
10   int value;
11   Data<Comparable> operator+(const Data<Comparable> &);
12   Data<Comparable> operator-(const Data<Comparable> &);
13   Data<Comparable> Data<Comparable>::addSubtract(const Data<Comparable> & rhs, int sign);
14 };
15
16 template<class Comparable>
17 Data<Comparable> Data<Comparable>::addSubtract(const 18 Data<Comparable> & rhs, int sign) {
18   int value1=this->value;
19   int value2=rhs.value;
20   Data<int> result(value1+(sign*value2));
21   return result;
22 }
23
24 template<class Comparable >
25 Data<Comparable> Data<Comparable>::operator+(const Data<Comparable> & rhs) {
26   return addSubtract(&rhs, 1);
27 }
28
29 template<class Comparable >
30 Data<Comparable> Data<Comparable>::operator-(const 31 Data<Comparable> & rhs) {
31   return addSubtract(&rhs, -1);
32 }
33
34 int main() {
35   Data<int> matrix1(2);
36   Data<int> matrix2(1);
37   cout<<"data1:"<<matrix1.value<<endl;
38   cout<<"data2:"<<matrix2.value<<endl;
39
40   Data<int> result1 = matrix1+matrix2;
41   cout<<"data1+data2"<<result1.value<<endl;
42
43   Data<int> result = matrix1-matrix2;
44   cout<<"data1-data2"<<result2.value<<endl;
45 }

このコードを実行したところ、以下のようなエラーメッセージが表示されて動かすことができません。
add.cpp:41: instantiated from here
add.cpp:26: error: invalid conversion from `const Data<int>*' to `int'
add.cpp:26: error: initializing argument 1 of Data<Comparable>::Data(int) [with Comparable = int]'
アドバイスをいただけるとありがたいです。

投稿日時 - 2009-11-27 15:23:40

QNo.5479991

困ってます

質問者が選んだベストアンサー

13行目の「Data<Comparable>::」
26、31行目「&」
がいらない。

投稿日時 - 2009-11-27 15:57:22

お礼

確かにそうですね。気がついていませんでした。
無事動かすごとができました。
どうもありがとうございました。

投稿日時 - 2009-11-27 16:06:05

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

すみませんさっきの投稿は完全に読み違えてました。
21,26,31行目でDataを値で返しているので、Dataのコピーコンストラクタをちゃんと定義してやるとよいのではないでしょうか。

投稿日時 - 2009-11-27 15:52:57

お礼

ありがとうございます。
追加してみようと思います。

投稿日時 - 2009-11-27 16:02:56

ANo.1

特殊化された定義
std::ostream& operator << (std::ostream&, const Data<int>&)
を与えてやるか、
Data の operator int() を定義してやったらどうでしょうか

投稿日時 - 2009-11-27 15:43:28