【问题标题】:Const error for this or no viable overload `=`此或没有可行重载的 const 错误`=`
【发布时间】:2017-02-13 18:48:16
【问题描述】:

我猜这是由于我的 = 运算符重载造成的。但我不知道为什么,即使我简化了 9 次代码。

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 {
       ^

错误clang++ 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.

【问题讨论】:

    标签: c++ templates constants


    【解决方案1】:

    Xtest()成员函数

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

    被定义为const,即不改变类的状态。但是,您正在更改成员变量 _a 的值,因此会出现错误。您需要删除函数中的最后一个const

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

    此外,int 类型的返回值中的 const 也没有多大作用,因为它可以复制到非常量 int。但返回引用是另一回事。

    【讨论】:

    • 非常感谢。已经在这个“东西”上待了 2 小时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2018-03-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    相关资源
    最近更新 更多