当我编译main.cpp时,我遇到了这样的错误:
prod_cons.hpp:26:8:注意:'pile_params :: pile_params(const pile_params&)'被隐式删除,因为默认定义不正确: struct pile_params {
main.cpp
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);
}
prod_cons.hpp
struct pile_params{
deque<string> deck;
stack<string> pile;
string url_racine;
condition_variable_any plein;
condition_variable_any vide;
mutex mut;
pile_params(string _url_racine) :
pile(deck), url_racine(_url_racine), plein(), vide(), mut(){}
};
struct vector_params{
vector<page> vect;
condition_variable_any plein;
condition_variable_any vide;
mutex mut;
vector_params(void) :
vect(), plein(), vide(), mut(){}
};
即使通过查看有关错误的其他主题,我也无法解决这个问题。
答案 0 :(得分:0)
pile_params pile_analyse(url_racine);
thread(..., pile_analyse, ...);
...但是我们无法调用复制构造函数,因为pile_params是不可复制的......因为std::mutex
是不可复制的(因此是condition_variable,IIRC)。
一个解决方法是通过引用传递参数:
threads_telechargement[i] = thread(telecharger,
pile_telechargement,
std::ref(pile_analyse),
vect_all_pages);
另一种方法是将shared_ptr<>
传递给参数。
答案 1 :(得分:0)
在回答新的答案/问题时,这里有一个完整的,最小的例子,它演示了如何解决问题。
您可以复制/粘贴此代码并直接编译/运行。
#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;
}
最后一点,在头文件中使用using namespace
是错误的。它会污染包含该标头的每个cpp文件中的全局命名空间。在一个包含3个文件的项目中,它并不重要。当项目增长时,它将非常重要。
答案 2 :(得分:0)
如果未在结构或类中定义构造函数,复制构造函数和move构造函数,则将隐式创建这些函数。
在main.cpp文件中,您调用复制构造函数,此函数隐式生成,如下所示:
struct pile_params
{
...
pile_params(pile_params& pile_params) = default;
};
然后,成员中的一个也不能复制,因此复制构造函数将格式错误,无法为其生成。
{p {3}}成员的copy构造函数不可复制,例如:
mutex( const mutex& ) = delete;