У меня возникла проблема с созданием статической библиотеки VC++, которая использует стандарт C++ 11 потоки.Ошибка C2280: 'std :: thread :: thread (const std :: thread &)': попытка ссылки на удаленную функцию
В настоящее время у меня есть два класса, и я могу объявить, а потом определить поток просто отлично в своем стартовом классе (который объявлен последним). На этом этапе код представляет собой только прослушиватель сокетов, который затем создает объект другого класса для обработки каждого принятого клиента. Эти дочерние объекты должны создавать потоки, которые мне нужны для параллельного сбора данных, кодирования и передачи.
Проблема: если я объявляю зЬй :: нить на моем другом классе, даже если точно, как я сделал на моем начальном классе, независимо от того, что я не получаю эту ошибку на сборке error C2280: 'std::thread::thread(const std::thread &)' : attempting to reference a deleted function [...]\vc\include\functional 1124 1
единственный способ, которым я смог обход этой ошибки, - просто не объявить объект std::thread
в последнем классе, что невозможно, в соответствии с тем, что я хочу сделать ...
Я использую VS2013 и моими источниками являются:
stdafx.h
#pragma once
#include "targetver.h"
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <Windows.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#include <thread>
#include <iostream>
#include <vector>
StreamServer.h
#pragma once
#define DEFAULT_BUFLEN 65535
#define DEFAULT_PORT "5649"
class StreamServerClient
{
public:
bool* terminate;
//std::thread client; //If I comment this line out, it builds just fine.
void DoNothing();
StreamServerClient(SOCKET clientSock, bool* ptTerm);
StreamServerClient();
~StreamServerClient();
};
class StreamServer
{
public:
bool terminate;
std::thread Listener;
std::vector<StreamServerClient> clients;
void CreateClient(SOCKET, bool*);
void Listen();
StreamServer();
~StreamServer();
};
StreamServer.cpp
#include "stdafx.h"
#include "StreamServer.h"
StreamServerClient::StreamServerClient(SOCKET clientSock, bool* ptTerm)
{
terminate = ptTerm;
//client = std::thread(&StreamServerClient::DoNothing, this); //Same thing as the declaration
}
StreamServerClient::StreamServerClient()
{
*terminate = false;
//client = std::thread(&StreamServerClient::DoNothing, this); //Same thing as the declaration
}
void StreamServerClient::DoNothing()
{
}
StreamServerClient::~StreamServerClient()
{
}
void StreamServer::Listen()
{
{...}
do {
clients.push_back(StreamServerClient::StreamServerClient(accept(listenSock, NULL, NULL), &terminate));
std::cout << "accepted a client!" << std::endl;
} while (!terminate);
}
StreamServer::StreamServer()
{
terminate = false;
Listener = std::thread(&StreamServer::Listen, this);
Listener.detach();
}
StreamServer::~StreamServer()
{
}
'std :: thread' не может быть скопирован. Aka, конструктор копирования «удален». –
@remyabel Но тогда почему я могу сделать это просто отлично для StreamServer? Что мне здесь не хватает? – Mismatch
@remyabel Crap, думаю, я только что заметил, что происходит ... Он также исчезает, если я прокомментирую 'clients.push_back (...)'. Должен ли я использовать 'std :: thread *' вместо этого? – Mismatch