将'const CMyclass'作为'this'参数传递给...丢弃限定符[-fpermissive]

时间:2014-12-20 20:38:40

标签: c++ compiler-errors function-pointers pass-by-reference lambda

通过

编译以下代码
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

3 个答案:

答案 0 :(得分:9)

由于你按价值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 { .. }
    

答案 1 :(得分:1)

你必须标记你的lambda mutable

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

答案 2 :(得分:0)

  

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

错误消息全部显示。 void CMyclass::my_method(const state_type&, double)需要一个普通的实例,但不是const个实例。将方法定义更改为

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

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