C++での, 演算子のオーバーロードについて
以下のコードをコンパイルした所,
#include <iostream>
#include <cmath>
#include <limits>
using namespace std;
// 自動微分
template <class Type> class Dual
{
public:
Type value, diff;
Dual();
Dual(Type v);
Dual(Type v, Type d);
Dual<Type>& operator=(Dual<Type> &d1);
Dual<Type> operator+(double x);
Dual<Type> operator+(const Dual<Type> &d1);
};
// コンストラクタ
template <class Type> Dual<Type>::Dual(){value = 0, diff = 0;}
template <class Type> Dual<Type>::Dual(Type v){value = v, diff = 0;}
template <class Type> Dual<Type>::Dual(Type v, Type d){value = v, diff = d;}
// print
template <class Type> void print(Dual<Type> dual){
cout << "Value: " << dual.value << ", Diff: " << dual.diff << endl;
}
// 代入
template <class Type> Dual<Type>& Dual<Type>::operator=(Dual<Type> &d1){
value = d1.value;
diff = d1.diff;
return *this;
}
// Dualとスカラーの足し算
template <class Type>
Dual<Type> Dual<Type>::operator+(double x){
Dual<Type> d2;
d2.value = x + value;
d2.diff = diff;
return d2;
}
// Dual同士の足し算
template <class Type> Dual<Type> Dual<Type>::operator+(const Dual<Type> &d1){
Dual<Type> d2(value, diff);
d2.value += d1.value;
d2.diff += d1.diff;
return d2;
}
int main(int argc, char *argv[])
{
Dual<double> dual1, dual2(4, 4);
dual1 = dual2 + 3.0;
print(dual1);
}
次のようなエラーが出ました。
hw2-1.cpp:166:9: error: no viable overloaded '='
dual1 = dual2 + 3.0;
~~~~~ ^ ~~~~~~~~~~~
hw2-1.cpp:40:15: note: candidate function not viable: expects an l-value for 1st
argument
Dual<Type>& operator=(Dual<Type> &d1){
^
main()内の
dual2 + 3.0
が実行されるとDual型の値が返るので, 変数dual1に正しく代入できると考えたのですが, なぜエラーが出るのか教えて頂けますか