電子書籍の厳選無料作品が豊富!

今、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]'
アドバイスをいただけるとありがたいです。

A 回答 (3件)

13行目の「Data<Comparable>::」


26、31行目「&」
がいらない。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/27 16:06

すみませんさっきの投稿は完全に読み違えてました。


21,26,31行目でDataを値で返しているので、Dataのコピーコンストラクタをちゃんと定義してやるとよいのではないでしょうか。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/11/27 16:02

特殊化された定義


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!