Soyons précis, cela compile, mais cela ne linke pas
Dans l'exemple que vous donnez, vous déclarez une variable globale (car un attribut de classe revient à ça), mais vous ne la définissez pas.
Il suffit, dans votre cas, de rajouter après la déclaration de la classe Device la ligne
Code :
- Device* Device::m_instance;
|
ou, si vous désirez l'intialiser
Code :
- Device* Device::m_instance = NULL;
|
Si vous aviez un Device.cpp, cela aurait été le bon endroit pour mettre cette déclaration, sinon, il faut la placer à un endroit unique (donc pas dans le fichier Device.h (ou alors en assurant l'unicité de la déclaration via des primitives de précompilation, mais cela n'est pas forcément utile de compliquer l'affaire ...)
Comme indiqué plus haut, faites comme si vous aviez une variable globale que vous déclareriez en extern dans un fichier .h, c'est exactement la même chose (à la visibilité près, du au fait que l'attribut de classe est privé, bien sûr ! )
Pour le 3e point, je dirais que non, pas à ma connaissance, le mieux serait de passer par des classes templates.
Bonne continuation !