通过
编译以下代码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
。
答案 0 :(得分:9)
由于你按价值my_class
获得了const
- 合格。您有三种方法可以解决它:
将const
添加到您的方法中:
void my_method(const state_type &x, const double t) const
通过引用捕获:
[&](const state_type &x, const double t) { .. }
或者让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初始化程序更改为您需要的任何内容(例如[&]
,但请确保它不是常量。