C ++ - 构造函数被隐式删除,因为默认定义是格式错误的

时间:2016-04-02 10:14:26

标签: c++ struct constructor compiler-errors g++

当我编译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(){}
    };

即使通过查看有关错误的其他主题,我也无法解决这个问题。

3 个答案:

答案 0 :(得分:0)

  1. 构建pile_params:
  2. pile_params pile_analyse(url_racine);

    1. 调用复制构造函数。
    2. 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;