2017-02-13 17 views
0

これは私の過負荷の=オペレータによって引き起こされると思います。しかし、なぜ私がコードを9回単純化した後でもわからない。実行可能な過負荷のためのConstエラー `= '

test9.cpp:

template<typename T> 
class A { 
public: 
    A(const T x): _x(x) {} 
    A() : _x(0) {} 

    template<typename T2> 
    void operator=(const A<T2> &rhs) { 
     _x = rhs._x; 
    } 
    T _x; 
}; 

template <typename T> 
class A_wrap { 
public: 
    A_wrap(const T x) : _a(x) {} 
    const A<T> _a; 
}; 

template <typename T> 
class X { 
public: 
    X() {} 
    const int test() const { 
     const A_wrap<T> a_wrap(10); 
     _a = a_wrap._a; 
    } 
    A<T> _a; 
}; 

int main() { 
    // This works. 
    A<int> _a; 
    const A_wrap<int> a_wrap(10); 
    _a = a_wrap._a; 
    // Below doesn't compile. 
    X<int> x; 
    x.test(); 
} 

エラー:G ++ 6

test9.cpp:39:12: required from here 
test9.cpp:27:12: error: passing ‘const A<int>’ as ‘this’ argument discards qualifiers [-fpermissive] 
     _a = a_wrap._a; 
     ~~~^~~~~~~~~~~ 
test9.cpp:2:7: note: in call to ‘constexpr A<int>& A<int>::operator=(const A<int>&)’ 
class A { 
    ^

エラー打ち鳴らす++ 3.8.1:

test9.cpp:27:12: error: no viable overloaded '=' 
     _a = a_wrap._a; 
     ~~^~~~~~~~~~ 
test9.cpp:39:7: note: in instantiation of member function 'X<int>::test' requested here 
    x.test(); 
    ^
test9.cpp:2:7: note: candidate function (the implicit copy assignment operator) not viable: 'this' 
     argument has type 'const A<int>', but method is not marked const 
class A { 
    ^
test9.cpp:8:10: note: candidate function not viable: 'this' argument has type 'const A<int>', but 
     method is not marked const 
    void operator=(const A<T2> &rhs) { 
     ^
1 error generated. 

答えて

1

test()メンバ関数のX

は、constと定義され、すなわち、クラスの状態を変更しない。ただし、メンバー変数_aの値が変更されているため、エラーになります。あなたは、関数の最後のconstを削除する必要があります。

const int test() { 
    const A_wrap<T> a_wrap(10); 
    _a = a_wrap._a; 
} 

また、それは非定数intにコピーすることができるようint型の戻り値にconstはあまりしません。しかし、参照を返すことは別の問題です。

+0

ありがとうございます。 2時間のようにこの「もの」に乗っている –

関連する問題