2 votes

La référence à une classe abstraite ne peut pas être transmise à une fonction thread ?

Je veux utiliser une référence à une classe abstraite ( A ) comme type de paramètre dans une fonction invoquée à l'aide de la fonction std::thread . Il semble que ce ne soit pas possible, car le compilateur essaie pour une raison quelconque de compiler : std::tuple<A> même si, dans mon code, seule une référence de type A est utilisé comme paramètre (jamais comme type de valeur).

#include <cstdlib>
#include <thread>

class A {
public:
  virtual void a() = 0;
};

class B : public A {
public:
  virtual void a() {
  }
};

class C {
public:
  C(A& aRef) {
    thread = std::thread(&C::doSomething, this, aRef);
  }
private:
  void doSomething(A& aRef) {

  }
  std::thread thread;
};

int main(int argc, char* argv[]) {
  B b;
  C c(b);
  return EXIT_SUCCESS;
}

La sortie se fera sur Visual Studio 2017 :

error C2259: 'A': cannot instantiate abstract class
tuple(278): note: see reference to class template instantiation 'std::tuple<A>' being compiled
tuple(278): note: see reference to class template instantiation 'std::tuple<C *,A>' being compiled
thread(49): note: see reference to class template instantiation 'std::tuple<void (__thiscall C::* )(A &),C *,A>' being compiled
main.cpp(18): note: see reference to function template instantiation 'std::thread::thread<void(__thiscall C::* )(A &),C*const ,A&,void>(_Fn &&,C *const &&,A &)' being compiled

Pourquoi std::thread essaie de compiler std::tuple<A> ? Si j'appelle C::doSomething directement depuis le main-thread, le code se compile bien.

Est-ce qu'il y a quelque chose que je manque ici ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X