将“const CMyclass”作为..的“this”参数传递.丢弃限定符 [-允许]

passing ‘const CMyclass’ as ‘this’ argument of ... discards qualifiers [-fpermissive]

本文关键字:允许 参数传递 CMyclass const 作为 this      更新时间:2023-10-16

编译以下代码

g++ -std=c++11 test.cpp

给我以下错误:

test.cpp: In lambda function:
test.cpp:17:128: error: passing ‘const CMyclass’ as ‘this’ argument of ‘void CMyclass::my_method(const state_type&, double)’ discards qualifiers [-fpermissive]
  std::function<void(const state_type &,const double)> observer = [=](const state_type &x,const double t){my_class.my_method(x,t);};
                                                                                                                                ^

我已经搜索了其他类似的问题,但我无法弄清楚这段代码有什么问题。

#include <vector>
#include <functional>
typedef std::vector<int> state_type;
class CMyclass
{
public:
    void my_method( const state_type &x , const double t )
    {
    }
};
int main()
{
    CMyclass my_class;
    std::function<void(const state_type &,const double)> observer =
         [=](const state_type &x,const double t)
         {
             my_class.my_method(x,t);
         };
}

编辑:

我不会把const放在方法之后。

由于您按值获取my_class因此const合格。您有三个选项可以修复它:

  1. 向方法添加const

    void my_method(const state_type &x, const double t) const
    
  2. 按引用捕获:

    [&](const state_type &x, const double t) { .. }
    
  3. 或者使 lambda 可变:

    [=](const state_type &x,const double t) mutable { .. }
    

你必须将你的lambda标记为可变的

observer = [=](const state_type &x,const double t) mutable {my_class.my_method(x,t);};

完整代码如下

#include <vector>
#include <functional>
typedef std::vector<int> state_type;
class CMyclass
{
public:
    void my_method( const state_type &x , const double t )
    {
    }
};
int main()
{
    CMyclass my_class;
    std::function<void(const state_type &,const double)> observer = 
        [=](const state_type &x,const double t) mutable {
            my_class.my_method(x,t);
        };
}

编译者 g++ -Wall -std=c++11 , GCC v4.9.2

传递const CMyclass作为void CMyclass::my_method(const state_type&, double)丢弃限定符this参数

错误消息说明了一切。 void CMyclass::my_method(const state_type&, double)期望一个正常的实例,而不是一个const实例。将方法定义更改为

void CMyclass::my_method(const state_type&, double) const;

以解决错误,或将 [=] Lambda 初始化器更改为您需要的任何内容(例如 [&],但请确保它不是常量。