C ++ en G ++: error de segmentación cuando no se utilizan punteros

Estoy tratando de usar G ++ para compilar un código C ++. Parece funcionar bien en otros compiladores, pero por alguna razón, G ++ no producirá resultados de trabajo.

Divulgar: Esto es parte de una tarea, pero siento que es más un problema de compilación, ya que funciona en otros compiladores.

Aquí está el fragmento que está causando estragos:

set<int> t1, t2;

Es extraño porque el siguiente código funciona bien:

set<int> *t1 = new set<int>();
set<int> *t2 = new set<int>();

De acuerdo, tengo que usar-> en lugar de., pero eso se espera. El primer fragmento produce un error de segmentación en tiempo de ejecución. El segundo hace intuitivamente lo que esperaría.

De todos modos, detrás de escena, el.cpp paraset tiene esto:

#include <cstdlib>
#include <iostream>

using namespace std;

template <class T>
set<T>::set() : bag<T>() {}

template <class T>
set<T>::set(const set<T>& b) : bag<T>(b) {}

los.h Se ve como esto:

#include "bag.h"

template <class T>
class set : public bag<T>
{ 
    public:
        set( );
        set(const set &b);

// ...

};
#include "set.cpp"

Y por último pero no menos importante, elbag.cpp ybag.h los archivos se ven así:

using namespace std;

template <class T>
bag<T>::bag() {
    head = NULL;
}

template <class T>
bag<T>::bag(const bag<T>& b) {

    // ...

}

ybag.h:

template <class T>
class bag
{ 
    public:
        bag( );
        bag(const bag &b);

    // ...
};
#include "bag.cpp"

Nuevamente, siento que G ++ simplemente me odia, pero de nuevo podría estar haciendo algo tonto. Solo un simple empujón en la dirección correcta sería genial.

Respuestas a la pregunta(1)

Su respuesta a la pregunta