主要原因是我使用了函数指针,而函数指针所指函数须得是静态才行


错误代码:

class Solution {public:string ReverseSentence(string str) {typedef string::const_iterator const_iter;const_iter b = str.begin();const_iter e = str.end();string ret;int first = 1;while( b != e ){b = find_if( b, e, legal );if( b < e ){const_iter after = find_if( b, e, illegal ); // 这里的调用出了问题,编译出错reference to non-static member function must be calledif( ret != "" ) ret = string(b, after) + " " + ret;else ret = string(b, after) + ret;b = after;}else{if( 1 == first ) return str;else first = 2;}}return ret;}
private:bool legal( char ch ){ return !illegal(ch); } // 这里是问题bool illegal( char ch ){ return isspace(ch); }
};

解决

分析上面的错误,应该说的是,find_if的第三个参数应该调用一个non static函数,这是什么原因?我们来看下find_if的代码

template<class InputIterator, class UnaryPredicate>InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{while (first!=last) {if (pred(*first)) return first;++first;}return last;
}

第三个谓词pred是一个非成员函数,因为pred的调用过程只有一个参数,就是*first。但是,对于像bool legal(char ch)这样的成员函数,它是属于类的,所以调用它必须需要对象才可以,这是因为bool legal这样的函数完整的标签是:

bool legal( Solution* this, char ch );

也就是它有一个implicit parameter,这才导致它无法被find_if这样的函数调用,主要是参数不匹配。当然,把这个函数改成static即可。

如果一定要非静态引用怎么办?

#include <string>
#include <memory>
#include "mutex"#ifndef HV_THREAD_POOL_H_
#define HV_THREAD_POOL_H_#include <vector>
#include <thread>
#include <queue>
#include <functional>
#include <atomic>
#include <mutex>
#include <condition_variable>
#include <future>
#include <memory>
#include <utility>
#include <stack>class HThreadPool {public:using Task = std::function<void()>;HThreadPool(int size = std::thread::hardware_concurrency()): pool_size(size), idle_num(size), status(STOP) {}~HThreadPool() {stop();}int start() {if (status == STOP) {status = RUNNING;for (int i = 0; i < pool_size; ++i) {workers.emplace_back(std::thread([this]{while (status != STOP) {while (status == PAUSE) {std::this_thread::yield();}Task task;{std::unique_lock<std::mutex> locker(_mutex);_cond.wait(locker, [this]{return status == STOP || !tasks.empty();});if (status == STOP) return;if (!tasks.empty()) {--idle_num;task = std::move(tasks.top());tasks.pop();}}task();++idle_num;}}));}}return 0;}int clear() {std::unique_lock<std::mutex> locker(_mutex);if (!tasks.empty()) {std::stack<Task>().swap(tasks);}return 0;}int stop() {if (status != STOP) {status = STOP;_cond.notify_all();for (auto& worker : workers) {worker.join();}}return 0;}int pause() {if (status == RUNNING) {status = PAUSE;}return 0;}int resume() {if (status == PAUSE) {status = RUNNING;}return 0;}int wait() {while (1) {if (status == STOP || (tasks.empty() && idle_num == pool_size)) {break;}std::this_thread::yield();}return 0;}// return a future, calling future.get() will wait task done and return RetType.// commit(fn, args...)// commit(std::bind(&Class::mem_fn, &obj))// commit(std::mem_fn(&Class::mem_fn, &obj))template<class Fn, class... Args>auto commit(Fn&& fn, Args&&... args) -> std::future<decltype(fn(args...))> {using RetType = decltype(fn(args...));auto task = std::make_shared<std::packaged_task<RetType()> >(std::bind(std::forward<Fn>(fn), std::forward<Args>(args)...));std::future<RetType> future = task->get_future();{std::lock_guard<std::mutex> locker(_mutex);tasks.emplace([task]{(*task)();});}_cond.notify_one();return future;}public:enum Status {STOP,RUNNING,PAUSE,};int                 pool_size;std::atomic<int>    idle_num;std::atomic<Status> status;std::vector<std::thread>    workers;std::stack<Task>            tasks;protected:std::mutex              _mutex;std::condition_variable _cond;
};#endif // HV_THREAD_POOL_H_class myClass{public:};class pool_task{HThreadPool *m_threadPool;std::string  my_name = "hhhhh" ;
public:pool_task(){m_threadPool = new HThreadPool(5);m_threadPool->start();}void pool_commit(){std::string param = "aaa";m_threadPool->commit([this, param] {return this->task(param); });}void task(const std::string& param){printf("aaaaaaaaaa, %s, %s\n", my_name.c_str(), param.c_str());}
};int main(){auto *p = new pool_task();p->pool_commit();getchar();return 0;
}

C/C++编程:reference to non-static member function must be called相关推荐

  1. 提示illegal reference to data member'CPMAgentManageDlg::m_matrixMatrixSt'in a static member function

    当提示"illegal reference to data member'CPMAgentManageDlg::m_matrixMatrixSt'in a static member fun ...

  2. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

  3. static Member Function

    // Test.h class Test { private: Test() ; ~Test() ; public: static Test &instance() ; // Maybe a ...

  4. 成员函数指针与高性能的C++委托 (Member Function Pointers and the Fastest Possible C++ Delegates)...

    标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托(delegate)")在一些 ...

  5. Warning: Static member accessed via instance reference

    Warning: Static member accessed via instance reference Shows references to static methods and fields ...

  6. error: reference to non-static member function must be called sort(nums.begin(),nums.end(),cmp1)

    leetcode179题中编译出现则个问题 出错的代码: class Solution { public:bool cmp1(const int& a, const int& b){s ...

  7. 【C++面向对象】类的静态成员函数(static member functions)

    一.静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用.而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象.类对象提供this指针给这种函数使 ...

  8. C++:错误:ISO C++ forbids in-class initialization of non-const static member ‘A::b’

    错误 不允许类内初始化,非常量静态成员: class.cpp:7:13: error: ISO C++ forbids in-class initialization of non-const sta ...

  9. c++ 编译错误is not a static member of ...

    这几天在项目中添加新功能,编译时出现is not a static member of ...的错误,傻眼的看了半天,没想明白哪里出错了,网上各种谷歌百度一番,stackoverflow也找了找,未果 ...

最新文章

  1. 简单明了!OLTP场景下的数据分布式设计原则
  2. 2.shiro工作原理(以集成springboot为例)
  3. vivado2017.4启动时提示的“error when launching'E:\vivado':Launcher time out”的问题
  4. android怎么实现标题搜索,Android Toolbar上SearchView的实现
  5. 声明式事务控制的配置要点
  6. android 状态栏、标题栏、屏幕高度
  7. pc样式在ie8中的bug
  8. centos6.5 MySQL 服务器_启用CentOS6.5 64位安装时自带的MySQL数据库服务器
  9. 网络游戏中网络模块浅析
  10. caffe的python接口学习(4):mnist实例---手写数字识别
  11. java中String类和StringBuffer类实例详解
  12. vs2008 sp1
  13. python爬取豆瓣电影top250并保存为xlsx_批量抓取豆瓣电影TOP250数据
  14. 浅谈贪吃蛇的创新玩法
  15. 人民日报谈美国减税:是在挑起税务战,国际税收秩序将陷混乱(zz)
  16. 什么是堆栈,堆和栈到底是不是一个概念
  17. 基于Autojs的淘宝/京东618自动化
  18. 基于WEB多媒体电子贺卡平台
  19. FastAPI 入门教程
  20. php select下拉框,下拉框处理(select)

热门文章

  1. Training Generative Adversarial Networks with Limited Data
  2. bycompare 工具使用
  3. RTP载荷H265(实战细节)
  4. 定积分的计算与辛普森积分及龙贝格积分
  5. 《时令绝杀技——向上汇报》
  6. C语言strlen等系列函数详细总结
  7. 前端css 清除浮动的几种方式
  8. 电脑自动关机是什么原因?为什么电脑会自动关机?轻松弄懂
  9. 谷歌Zxing Utils
  10. mysql事务排队情况_MySQL事务问题