开发者社区> 问答> 正文

c++11 std::thread() 找不到函数?报错

环境:g++ 4.8.1 ubuntu12.04

std::thread() 报错

g++ -std=c++0x -c client.cpp

client.cpp line 73 error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>)’
     std::thread t(RecvMsg);

我明明写了RecvMsg()了啊  

还有 就是改成C风格就不会报错(C风格的在这里

代码也挺简单的  大神花几分钟看看吧 

/*
 * clinet.h
 */
#ifndef CLIENT_H
#define CLIENT_H

#include <iostream>
#include <arpa/inet.h> // socket ..
#include <unistd.h>    // close()
#include <thread>
#include <string>
#include <cstring> // memset()
using namespace std;
class Client{
private:
	int sockfd;
	struct sockaddr_in serv_addr;
	void SendMsg(const string &msg);
    void RecvMsg();
public:
	~Client();

    int  startClient(const string &ip, const int port);
	void stopClient();
};
#endif

/*
 *client.cpp
 */

#include "client.h"
void Client::SendMsg(const string &msg) {
	if(-1 == send(sockfd, msg.c_str(), msg.size(), 0))
		cout<<"Failed to send"<<endl;
}

void Client::RecvMsg(){
	int len;
	char recv_buf[1024];
	while (1) {
		memset(recv_buf, 0, sizeof(recv_buf));
        len = recv(sockfd, recv_buf, sizeof(recv_buf), 0);
		if (-1 == len) {
			cout<<"Failed to recv"<<endl;
		}
		if(0 == len){
            close(sockfd);
			cout<<"与服务器断开链接!"<<endl;
			break;
		}
		cout<<"Receive message: "<<recv_buf<<endl;
	}
}

int Client::startClient(const string &ip, const int port){
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == sockfd) {
		cout<<"Failed to sockfd"<<endl;
		return -1;
	}

	memset(&serv_addr, 0, sizeof(serv_addr));
	serv_addr.sin_family = AF_INET;
	serv_addr.sin_port = htons(port);
    serv_addr.sin_addr.s_addr = inet_addr(ip.c_str());

	int stat = connect(sockfd, (struct sockaddr *) &serv_addr,sizeof(serv_addr));
	if (-1 == stat) {
		cout<<"Failed to connect"<<endl;
		return -1;
	}
    std::thread t(RecvMsg);
    t.detach();
	while(1)
	{
		string send_msg;
		
		cin>>send_msg;
		if (send_msg == "q")
		{
			cout<<"结束客户端!"<<endl;
			break;
		}
		else
			SendMsg(send_msg);
	}
	return 0;
}

void Client::stopClient() {
	close(sockfd);
}

Client::~Client() {
	stopClient();
}


展开
收起
爱吃鱼的程序员 2020-06-22 14:49:14 1416 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这个应该是 RecvMsg的类型造成的,这个是成员函数,而你的C版本中,它只是个普通函数.

    可能在std::thread的构造函数中根本不支持用非静态成员函数构造.

    我想的办法有点曲折:

    把73行改为std::threadt( mem_fun_t<void, Client>( RecvMsg),this);

    看看行不行,我也没试过.

    解决了,原因就是std::thread的构造函数中根本不支持用非静态成员函数构造.我把SendMsg改为静态函数了。另外你说的那个方法还是回报错,我再查查资料吧,感谢(>^ω^<)回答 std::threadt(&Client::RecvMsg,this),多看看范型的functional,bind之类的实现。嗯,thread的构造不支持非静态成员函数作为第一个参数,你的回答很专业! 应该是编译命令“g++-std=c++0x-cclient.cpp”的问题吧,你改成 g++-std=c++11-cclient.cpp试试呢-std=c++11跟-std=c++0x的区别就在于前者需要4.7+而后者只需要4.3+。不行啊,改成-std=c++11还是报一样的错误o(╯□╰)o

    引用来自“ddrm”的答案

    std::threadt(&Client::RecvMsg,this),多看看范型的functional,bind之类的实现。
    2020-06-22 14:49:31
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载