Non controlli se si esce o no dai limiti dell' array di booleani:
codice:
template<class tipoelem>
void insiemev<tipoelem>::unione(insiemev<tipoelem> &A, insiemev<tipoelem> &B)
{
   int max=A.dimset;
   if(max<B.dimset)
       max=B.dimset;
   for(int i = 0; i < max; i++)
   {
      if(i<A.dimset)
         if(A.appartiene(i))
            this->inserisci(i);
      if(i<B.dimset)
         if(B.appartiene(i))
            this->inserisci(i);
   }
}
E non ti ha dato segmentation fault per caso.Per cui se l' array di booleani di B era composto da 5 campi, ha letto anche quelli oltre.E per caso ce ne erano alcuni che sono stati letti come veri.
Ma potevi semplicemente risolvere con un:
codice:
template<class tipoelem>
bool insiemev<tipoelem>::appartiene(tipoelem elem)
{
   bool result=elem<dimset;
   if(result)
      result=set[elem];
   return result;
}
Però c'è da dire che al posto del metodo unione avresti potuto implementare l' operatore | , e che avendo realizzato questa classe con i template, ti da errore se tipoelem=string, visto che un valore come "ciao" non è un indice valido dell' array set.