C/C++编程:reference to non-static member function must be called
主要原因是我使用了函数指针,而函数指针所指函数须得是静态才行
错误代码:
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相关推荐
- 提示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 ...
- c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...
- static Member Function
// Test.h class Test { private: Test() ; ~Test() ; public: static Test &instance() ; // Maybe a ...
- 成员函数指针与高性能的C++委托 (Member Function Pointers and the Fastest Possible C++ Delegates)...
标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托(delegate)")在一些 ...
- Warning: Static member accessed via instance reference
Warning: Static member accessed via instance reference Shows references to static methods and fields ...
- 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 ...
- 【C++面向对象】类的静态成员函数(static member functions)
一.静态成员函数的引入 在引入静态成员函数之前,C++语言要求所有的成员函数都必须经由该类的对象来调用.而实际上,只有当成员函数中有存取非静态数据成员时才需要类对象.类对象提供this指针给这种函数使 ...
- 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 ...
- c++ 编译错误is not a static member of ...
这几天在项目中添加新功能,编译时出现is not a static member of ...的错误,傻眼的看了半天,没想明白哪里出错了,网上各种谷歌百度一番,stackoverflow也找了找,未果 ...
最新文章
- 简单明了!OLTP场景下的数据分布式设计原则
- 2.shiro工作原理(以集成springboot为例)
- vivado2017.4启动时提示的“error when launching'E:\vivado':Launcher time out”的问题
- android怎么实现标题搜索,Android Toolbar上SearchView的实现
- 声明式事务控制的配置要点
- android 状态栏、标题栏、屏幕高度
- pc样式在ie8中的bug
- centos6.5 MySQL 服务器_启用CentOS6.5 64位安装时自带的MySQL数据库服务器
- 网络游戏中网络模块浅析
- caffe的python接口学习(4):mnist实例---手写数字识别
- java中String类和StringBuffer类实例详解
- vs2008 sp1
- python爬取豆瓣电影top250并保存为xlsx_批量抓取豆瓣电影TOP250数据
- 浅谈贪吃蛇的创新玩法
- 人民日报谈美国减税:是在挑起税务战,国际税收秩序将陷混乱(zz)
- 什么是堆栈,堆和栈到底是不是一个概念
- 基于Autojs的淘宝/京东618自动化
- 基于WEB多媒体电子贺卡平台
- FastAPI 入门教程
- php select下拉框,下拉框处理(select)