title: C++ polymorphism with variadic function parameter
body: <p>I am sharing with you an issue that I got with a class using variadic function parameters. It is the class Thread shown in the following code. It is a wrapper of std::thread in order to use the function pattern.</p>
  
  <p>I wanted to use polymorphism with this function in inheriting the class Thread into a new class, Functor, but gcc returns the errors bellow:</p>
  
  <pre><code>#include &lt;thread&gt;
  #include &lt;iostream&gt;
  
  using namespace std;
  
  template&lt;class... Args&gt;
  class Thread
  {
  public:
      virtual void operator()(Args...) = 0;
  
      void run(Args... args)
      {
      std::thread t(std::forward&lt; Thread&lt;Args...&gt; &gt;(*this), std::forward&lt;Args&gt;(args)...);
      t.join();
      }
  };
  
  template&lt;class... Args&gt;
  class Functor : public Thread&lt;Args...&gt;
  {
  public:
      // generates the errors bellow
      virtual void operator()(Args... /*args*/)
      {
      }
  
      // doesnot work since the pure virtual function wants another prototype of function.
      // void operator()(int)
      // {
      // }
  };
  
  int main()
  {
      int a = 12;
      Functor&lt;int&gt; f;
      f.run(ref(a));
  
      return 0;
  }
  </code></pre>
  
  <pre>
  from t-Thread-args2.cpp:1:
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple: In instantiation of ‘struct std::_Head_base, false>’:
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:215:12:   required from ‘struct std::_Tuple_impl, int>’
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:507:11:   required from ‘class std::tuple, int>’
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/functional:1601:39:   required from ‘struct std::_Bind_simple(int)>’
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/thread:133:9:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = Thread; _Args = {int}]’
  t-Thread-args2.cpp:14:83:   required from ‘void Thread::run(Args ...) [with Args = {int}]’
  t-Thread-args2.cpp:42:17:   required from here
  /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/tuple:166:13: error: cannot declare field ‘std::_Head_base, false>::_M_head_impl’ to be of abstract type ‘Thread’
  t-Thread-args2.cpp:7:7: note:   because the following virtual functions are pure within ‘Thread’:
  t-Thread-args2.cpp:10:18: note:     void Thread::operator()(Args ...) [with Args = {int}]
  </pre>
  
  <p>I dont really understand the error since the pure virtual function was well defined in the deriveted class. However, in moving the function run() into the derivated class (Functor) it works.</p>
  
  <p>Thanks in advance,
  Caner</p>