Il viole Règle de la définition unique . Il est difficile pour le compilateur de détecter l'erreur, car ils sont dans des unités de compilation différentes. Et même le linker ne peut pas détecter toutes les erreurs.
Voir un exemple dans http://www.cplusplus.com/forum/general/32010/ . Mon compilateur et mon éditeur de liens (g++ 4.2.1) peuvent construire l'exécutable final sans aucune erreur, mais la sortie est erronée.
Si je change un peu l'exemple, j'obtiens un défaut de segmentation.
// main.cpp
#include <iostream>
#include <list>
using namespace std;
struct Handler
{
Handler() : d(10, 1.234) {}
list<double> d;
};
extern void test_func();
int main(void)
{
Handler h;
cout << h.d.back() << endl;
test_func();
return 0;
}
// test.cpp
#include <iostream>
#include <string>
using namespace std;
struct Handler
{
Handler() : d("test Handler") {}
string d;
};
void test_func()
{
Handler h;
cout << h.d << endl;
}
Il est recommandé de différencier votre classe par espace de nom. Par exemple pour Node, vous pouvez utiliser la classe nest et définir le Node dans la classe parent list. Ou vous pouvez ajouter votre classe dans un espace de nom anonyme. Voir Comment un type qui n'est utilisé que dans une seule unité de compilation peut-il violer la règle de la définition unique ?