#include <iostream>
#include <string>
#include <thread>

template <typename T>
class Queue
{
 public:
  T pop() {}
  void push(const T& item) {}
};

void produce(Queue<int>& q) {
    q.push(1234);
}

// wenn diese Funktion auskommentiert ist, funktioniert es
void produce(Queue<std::string>& q) {
   q.push("Hallo");
}

int main()
{
  Queue<int> my_queue;
  auto f = std::bind(static_cast<void (*) (Queue<int>&)> (produce), my_queue); // <<<  FEHLER
  
  // Alternative
  auto g = [&] () { produce (my_queue); };
}