Lorsque j'utilise spécialisée modèle dans les différents fichiers objets, je reçois une "définition de plusieurs" erreur lors de la liaison. La seule solution que j'ai trouvé consiste à utiliser le "inline" de la fonction, mais il semble juste comme certains solution de contournement. Comment puis-je 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 autres.c -o d'autres.o-Wall -Wextra g++ main.c autres.o -o -Wall-Wextra
Enfin:
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écommentez la "inline" à l'intérieur de bonjour.h le code de compiler et de l'exécuter, mais il semble tout simplement une sorte de "solution de contournement" pour moi: que faire si la fonction spécialisée qui est gros et utilisé de nombreuses fois? Vais-je obtenir un gros binaire? Est-il un autre moyen pour ce faire? Si oui, comment? Si non, pourquoi?
J'ai essayé de chercher des réponses, mais je n'ai eu "use inline", sans autre explication.
Merci