【问题标题】:passing ‘const CMyclass’ as ‘this’ argument of ... discards qualifiers [-fpermissive]将“const CMyclass”作为 ... 的“this”参数传递,丢弃限定符 [-fpermissive]
【发布时间】:2014-12-20 20:38:40
【问题描述】:

通过

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

【问题讨论】:

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


    【解决方案1】:

    由于您按价值取值,my_class 变为 const-qualified。您可以通过三个选项来修复它:

    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 { .. }
      

    【讨论】:

    • 第二个选项正是我所需要的。
    【解决方案2】:

    你必须将你的 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

    【讨论】:

      【解决方案3】:

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

      错误信息说明了一切。 void CMyclass::my_method(const state_type&amp;, double) 需要一个普通实例,但不是 const 一个。将方法定义更改为

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多