Bonjour à tous,

Depuis 3 jours, j’essaie de comprendre comment fonctionne le mot clé extern compte tenu des différentes applications qu'il peut avoir. Malgré toute la documentation que je trouve sur internet, il me reste encore à pouvoir combiner ce mot clé avec les template et ce, pour de l'instanciation de classes mais aussi l'utilisation de fonctions templates.

Ci-dessous, les 3 parties du code que j'essaie de faire compiler :

* Le main.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "etst.hpp"
 
testing::object_vector<int> myVect;
 
int main()
{
	add<int>(3);	// undefined reference to "void add<int>(int const &)"
 
 
    std::cout<< "val A = " << "a" << std::endl;
    std::cout<< "val B = " << "b" << std::endl;
 
    return 0;
};

* le tst.hpp (contenant la classe principale) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#pragma once
 
#include <vector>
#include <cassert>
#include <cstddef>
 
 
namespace testing
{
	template<typename T>
	class object_vector
	{
	private:
		std::vector<T> vect_;
 
	public:
		object_vector() {}
 
		void add(T const & obj){
			vect_.push_back(obj);
		}
 
		T & get(size_t const & id){
			assert(vect_.size() > id && "out of limits");
			return vect_[id];
		}
 
	};
}

et enfin la partie en cours de développement, le etst.hpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#pragma once
#include "tst.hpp"
 
 
namespace testing
{
	template<typename T>
	class object_vector;
}
 
 
template<typename T>
extern testing::object_vector<T> myVect;
 
template<typename T>
void add(T const & obj)
{
	myVect<T>.add(obj);
}
 
 
template<typename T>
T & ovget(size_t const & id)
{
	return myVect<T>.get(id);
}

Vous l'aurez compris, ceci n'est qu'un code rapide destiné à tester le principe. Ici, l'objectif est de "créer" à la volée des objets des la classe object_vector en fonction du type de donnée entrée, et d'ajouter des valeurs de ce type dans ce nouvel objet.
Concrètement, je dois pouvoir réaliser des appels du type add<int>(12); ou add<float>(3.5f); etc...

Aujourd'hui, sans l'utilisation du code présent dans "etst.hpp", et donc en appelant directement les méthodes de object_vector le code fonctionne. Par contre, lorsque je souhaite mettre en place le code présent dans "etst.hpp", selon les différentes configurations essayées, j'obtiens soit error: 'testing::object_vector<int> myVect' redeclared as different kind of symbol avec le code fourni ci-dessus, soit error: undefined reference to 'void add<int>(int const &)' (si je fais l'essai en adaptant "etst.hpp" en "etst.cpp").

J'ai alors bien entendu essayé plusieurs autres adaptations de ce code, mais globalement, ce sont les erreurs que je retrouve régulièrement et dont je recherche en vain les explications...

Quelqu'un saurait m'aiguiller sur une correction ?


Merci d'avance.