C ++ Как инициализировать статическую переменную класса, который содержит мьютекс - PullRequest
1 голос
/ 24 октября 2019

У меня есть шаблонный класс с мьютексом:

template <typename T> class A {
 public:
  std::mutex classMutex;
  T value;
  A(T initValue) : value(initValue){}
};   

и второй класс со статическим членом первого класса:

class B{
  static A<double> test;
}; 
A<double> B::test = 0.0;

Я получаю сообщение об ошибке: "Копирование переменной типа 'A' вызывает удаленный конструктор "

1 Ответ

1 голос
/ 24 октября 2019

Благодаря @ rafix07:

Решение:

A<double> B::test{0.0};

"мьютекс не является ни копируемым, ни подвижным, это означает, что все операции копирования и перемещения по умолчанию удаляются (для класса, которыйсодержит мьютекс как переменную данных)

 A(const A&) = delete,
 A(A&&) = delete 

и т. д. При вызове

A<double> B::test = 0.0 

двойное значение 0.0 преобразуется в

A<double>(0.0) 

, поэтому у вас есть

A<double> B::test = A<double>(0.0) 

, поскольку конструкция копии удалена, компилятор отклоняет эту строку. С {} вы просто вызываете конструктор A (0.0) без какого-либо синтаксиса копирования. "@ rafix07

...