C++ C++;-构造函数被隐式删除,因为默认定义的格式不正确
在编译main.cpp时,我遇到了以下错误: prod_cons.hpp:26:8:注意:“pile_params::pile_params(const pile_params&)”被隐式删除,因为默认定义的格式可能不正确: 结构桩参数{ main.cppC++ C++;-构造函数被隐式删除,因为默认定义的格式不正确,c++,struct,constructor,compiler-errors,g++,C++,Struct,Constructor,Compiler Errors,G++,在编译main.cpp时,我遇到了以下错误: prod_cons.hpp:26:8:注意:“pile_params::pile_params(const pile_params&)”被隐式删除,因为默认定义的格式可能不正确: 结构桩参数{ main.cpp pile_params pile_analyse(url_racine); pile_params pile_telechargement(url_racine); vector_params vect_all_pages(); vector
pile_params pile_analyse(url_racine);
pile_params pile_telechargement(url_racine);
vector_params vect_all_pages();
vector<thread> threads_analyse;
vector<thread> threads_telechargement;
for(int i=0; i<nb_th_get;i++){
threads_telechargement[i] = thread(telecharger,pile_telechargement,pile_analyse,vect_all_pages);
}
for(int i=0; i<nb_th_analyse;i++){
threads_telechargement[i] = thread(analyser,profondeur,pile_telechargement,pile_analyse,vect_all_pages);
}
桩参数桩分析(url\u racine);
桩参数桩远程充电(url\u racine);
向量参数向量所有页面();
向量分析;
矢量线荷电;
对于(int i=0;i
构建桩参数:
pile\u参数pile\u分析(url\u racine);
调用复制构造函数
thread(…,pile_analysis,…)
…但是我们不能调用复制构造函数,因为pile_参数是不可复制的…因为std::mutex
是不可复制的(条件变量IIRC也是如此)
一种修复方法是通过引用传递参数:
threads_telechargement[i] = thread(telecharger,
pile_telechargement,
std::ref(pile_analyse),
vect_all_pages);
另一种方法是将一个共享的\u ptr
传递给参数。作为对新答案/问题的响应,下面是一个完整的最小示例,演示如何解决问题
您可以复制/粘贴此代码并直接编译/运行它
#include <iostream>
#include <string>
#include <memory>
#include <mutex>
#include <thread>
#include <functional>
#include <future>
#include <deque>
#include <stack>
#include <vector>
#include <condition_variable>
struct pile_params{
std::deque<std::string> deck;
std::stack<std::string> pile;
std::string url_racine;
std::condition_variable_any plein;
std::condition_variable_any vide;
std::mutex mut;
pile_params(std::string _url_racine) :
pile(deck), url_racine(std::move(_url_racine)), plein(), vide(), mut(){}
};
struct page {};
struct vector_params{
std::vector<page> vect;
std::condition_variable_any plein;
std::condition_variable_any vide;
std::mutex mut;
vector_params() :
vect(), plein(), vide(), mut(){}
};
void telecharger(pile_params &a_telecharger, pile_params &a_analyser, vector_params &tlp)
{
}
int main()
{
auto url_racine = "";
pile_params pile_analyse(url_racine);
pile_params pile_telechargement(url_racine);
vector_params vect_all_pages;
std::vector<std::thread> threads_analyse;
std::vector<std::thread> threads_telechargement;
auto nb_th_get = 100;
for(int i=0; i<nb_th_get;i++){
threads_telechargement.emplace_back(telecharger,
std::ref(pile_telechargement),
std::ref(pile_analyse),
std::ref(vect_all_pages));
}
for (auto&t : threads_telechargement)
{
if (t.joinable())
t.join();
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构桩参数{
甲板;
std::堆垛;
std::字符串url\u racine;
std::条件变量任何褶皱;
std::条件变量;
std::互斥mut;
pile_参数(标准::字符串_url_racine):
pile(deck),url_racine(std::move(_url_racine)),plein(),vide(),mut(){}
};
结构页{};
结构向量参数{
std::vector-vect;
std::条件变量任何褶皱;
std::条件变量;
std::互斥mut;
向量参数():
vect(),plein(),vide(),mut(){}
};
无效远程充电器(桩参数和a参数远程充电器、桩参数和a参数分析仪、矢量参数和tlp)
{
}
int main()
{
自动url_racine=“”;
桩参数桩分析(url_racine);
桩参数桩远程充电(url\u racine);
向量参数向量所有页面;
std::向量线程分析;
std::向量线程和远程充电;
自动nb_th_get=100;
对于(int i=0;i如果在结构或类中未定义构造函数、复制构造函数和移动构造函数,则隐式创建这些函数
在main.cpp文件中,调用复制构造函数并隐式生成此函数,如下所示:
struct pile_params
{
...
pile_params(pile_params& pile_params) = default;
};
那么在成员中,一个1也是不可复制的,所以复制构造函数的格式将是错误的,并且无法为其生成
成员的复制构造函数是不可复制的,如:
mutex( const mutex& ) = delete;
可能的重复我认为问题不是来自互斥。你错了,Aissa。std::mutex
是不可复制的。结果是,包含一个的struct
或class
也不可复制,因此复制构造函数的格式将不正确,无法为其生成。请尝试删除de>mutex
和condition\u变量
成员(都是不可复制的),您会发现问题消失了。
mutex( const mutex& ) = delete;