Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-构造函数被隐式删除,因为默认定义的格式不正确_C++_Struct_Constructor_Compiler Errors_G++ - Fatal编程技术网

C++ C++;-构造函数被隐式删除,因为默认定义的格式不正确

C++ 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

在编译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<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;