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 ?