18258


以下のコードをコンパイルした所,

[code]

    #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);
    }
    
[/code]

次のようなエラーが出ました。

[code]

    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){
                  ^
    
[/code]

main()内の

[code]

     dual2 + 3.0 
    
[/code]

が実行されるとDual型の値が返るので, 変数dual1に正しく代入できると考えたのですが, なぜエラーが出るのか教えて頂けますか


CC BY-SA 3.0
2015-10-30T18:00:08.253
18257
2015-10-30T18:28:11.020
10725
question
c++
C++での, 演算子のオーバーロードについて


オーバーロードの問題というより、 const がつかない関数の参照に、右辺値を突っ込んでいるのが問題です。

[code]

    Dual<Type>& operator=(const Dual<Type> &d1);
    
[/code]

で宣言し、定義も同様に、 `const` を付与すると、エラーは解消します。

* * *

よりわかりやすい例は、次になるかと思います。

[code]

    #include<iostream>
    
    int incr(int &i) {
        return i+1;
    }
    
    int incl(const int &i) {
        return i+1;
    }
    
    int main() {
        int n=1;
    
        // 質問と同じようなエラー
        // printf("%d\n", incr(n+1));
    
        printf("%d\n", incl(n+1));
    
    }
    
[/code]


CC BY-SA 3.0
2015-10-30T18:28:11.020
18258
2015-10-30T18:28:11.020
754
18257
answer