Problème template générique dans une classe

Bonjour
J'écris une classe qui ressemble à des vecteurs et des matrices pour faire des opérations. Je la définis avec un template
template <typename T>
pour pouvoir choisir mon type ensuite (int, float, etc).

Ca compile bien, mais j'ai un problème lors de l'édition de lien.
Dans mon ino, qui appelle la classe, je définis :
Array<int16_t> a({1, 2, 3});
et j'obtiens ces messages d'erreur :

Arduino : 1.8.15 (Windows 10), Carte : "ESP32 Dev Module, Disabled, Default 4MB with spiffs (1.2MB APP/1.5MB SPIFFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, None"

sketch\sketch_dec06a.ino.cpp.o:(.literal._Z5setupv+0x18): undefined reference to `Array::Array(std::vector<short, std::allocator >)'

sketch\sketch_dec06a.ino.cpp.o:(.literal._Z5setupv+0x1c): undefined reference to `Array::~Array()'

sketch\sketch_dec06a.ino.cpp.o: In function `setup()':

C:\Users\Documents\Arduino\sketch_dec06a/sketch_dec06a.ino:6: undefined reference to `Array::Array(std::vector<short, std::allocator >)'

C:\Users\Documents\Arduino\sketch_dec06a/sketch_dec06a.ino:6: undefined reference to `Array::~Array()'

collect2.exe: error: ld returned 1 exit status

exit status 1

Donc, il ne trouve pas le constructeur et le destructeur.
Pourtant, je les ai bien déclarés :

Fichier .h

template <typename T>
class Array {

public:
	Array( int = 10 ); // default constructor
	Array( const Array & ); // copy constructor
	Array( const std::vector<T> ); // init from vector
	~Array(); // destructor

et fichier cpp:

// Init from vector
template <typename T>
Array<T>::Array( const std::vector<T> init ) : size( init.size() )
{
	ptr = new T[ size ]; // create space for array
	assert( ptr != 0 ); // terminate if memory not allocated
	++arrayCount; // count one more object
	for ( int i = 0; i < size; i++ )
		ptr[ i ] = init[ i ]; // copy init into object
}

// Destructor for class Array
template <typename T>
Array<T>::~Array()
{
	delete [] ptr; // reclaim space for array
	--arrayCount; // one fewer object
}

La compilation se passe bien, pourquoi l'éditeur de liens ne trouve t-il pas mes fonctions ?

Bonjour,

Les fonctions qui utilisent des templates doivent être définies dans le .h
Les templates sont résolus à la compilation et non à l'édition de liens.

Donc je dois déplacer les définitions de mes fonctions dans le corps de la classe dans le fichier .h ? Dans la section public ?
Faut-il conserver les prototypes alors ?

Oui.
Je pense qu'on peut aussi mettre le prototype dans la class et le corps de la fonction dans le .h hors de la class comme on le ferait dans un .cpp

Ca marche si je les mets dans le fichier .h en dehors de la classe, en conservant les prototypes. Merci @kamill !

Ok. Bonne continuation

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.