Lorsque j'utilise un modèle spécialisé dans différents fichiers objets, j'obtiens une erreur de «définition multiple» lors de la liaison. La seule solution que j'ai trouvée consiste à utiliser la fonction "en ligne", mais cela semble être une solution de contournement. Comment résoudre ce problème sans utiliser le mot clé "inline"? Si ce n'est pas possible, pourquoi?
Voici l'exemple de code:
paulo@aeris:~/teste/cpp/redef$ cat hello.h
#ifndef TEMPLATE_H
#define TEMPLATE_H
#include <iostream>
template <class T>
class Hello
{
public:
void print_hello(T var);
};
template <class T>
void Hello<T>::print_hello(T var)
{
std::cout << "Hello generic function " << var << "\n";
}
template <> //inline
void Hello<int>::print_hello(int var)
{
std::cout << "Hello specialized function " << var << "\n";
}
#endif
paulo@aeris:~/teste/cpp/redef$ cat other.h
#include <iostream>
void other_func();
paulo@aeris:~/teste/cpp/redef$ cat other.c
#include "other.h"
#include "hello.h"
void other_func()
{
Hello<char> hc;
Hello<int> hi;
hc.print_hello('a');
hi.print_hello(1);
}
paulo@aeris:~/teste/cpp/redef$ cat main.c
#include "hello.h"
#include "other.h"
int main()
{
Hello<char> hc;
Hello<int> hi;
hc.print_hello('a');
hi.print_hello(1);
other_func();
return 0;
}
paulo@aeris:~/teste/cpp/redef$ cat Makefile
all:
g++ -c other.c -o other.o -Wall -Wextra
g++ main.c other.o -o main -Wall -Wextra
Finalement:
paulo@aeris:~/teste/cpp/redef$ make
g++ -c other.c -o other.o -Wall -Wextra
g++ main.c other.o -o main -Wall -Wextra
other.o: In function `Hello<int>::print_hello(int)':
other.c:(.text+0x0): multiple definition of `Hello<int>::print_hello(int)'
/tmp/cc0dZS9l.o:main.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: ** [all] Erro 1
Si je décommente le "inline" dans hello.h, le code se compilera et s'exécutera, mais cela me semble être une sorte de "contournement": et si la fonction spécialisée est volumineuse et utilisée plusieurs fois? Vais-je avoir un gros binaire? Y a-t-un autre moyen de faire ça? Si oui, comment? Si non, pourquoi?
J'ai essayé de chercher des réponses, mais tout ce que j'ai obtenu était "utiliser en ligne" sans aucune autre explication.
Merci