Si, effettivamente ho notato a posteriori che il carattere immesso nello switch era vuoto.
Così ho modificato la funzione Inserimento del controllo input in:

codice:
template <typename T>
T Inserimento (T ins){
  int a, b;
  T output;
  std::string::size_type sz;
  do{
  std::string str;
  std::cin.clear();
  std::getline(std::cin, str);
  if(typeid(ins) == typeid(int)){
    a = 0;
    try{
      output=std::stoi(str,&sz);
    }catch(const std::invalid_argument& ia){}
  }else if(typeid(ins) == typeid(char)){
    a = 1;
    output = str[0];
  }
  else {
    a = 2;
    //output=str;
  } 
  b = ReadStr(str);
  if (a != b){
    std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
  } else {return output;}
  }while (a != b);
con la modifica che nel resto del programma Inserimento viene così assegnato:

codice:
c=Inserimento(c)
Così infatti è tutto più controllato e lo switch non riscontra impedimenti.

Ho tuttavia un'altra difficoltà: se lancio il controllo input anche con la riga che ora è commentata in Inserimento (//output=str;), mi segnala errore in quanto riscontrerebbe difficoltà assegnare la stringa str alla variabile output nei casi in cui questa sia definita int o char.