Quando si utilizza un modello specializzato in diversi file oggetto, viene visualizzato un errore di "definizione multipla" durante il collegamento. L'unica soluzione che ho trovato riguarda l'uso della funzione "inline", ma sembra solo una soluzione. Come faccio a risolverlo senza usare la parola chiave "in linea"? Se questo non è possibile, perché?definizione multipla della specializzazione del modello quando si utilizzano oggetti diversi
Ecco il codice di esempio:
[email protected]:~/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
[email protected]:~/teste/cpp/redef$ cat other.h
#include <iostream>
void other_func();
[email protected]:~/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);
}
[email protected]:~/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;
}
[email protected]:~/teste/cpp/redef$ cat Makefile
all:
g++ -c other.c -o other.o -Wall -Wextra
g++ main.c other.o -o main -Wall -Wextra
Infine:
[email protected]:~/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
Se togliere il commento alla "linea" all'interno ciao.h, il codice verrà compilato ed eseguito, ma che sembra proprio come una sorta di "soluzione" per me: che cosa se la funzione specializzata è grande e usata molte volte? Riceverò un grosso binario? C'è un altro modo di fare questo? Se sì, come? Se no, perché?
Ho provato a cercare le risposte, ma tutto ciò che ho ottenuto è stato "utilizzare in linea" senza ulteriori spiegazioni.
Grazie
inserire l'implementazione specializzata in .cpp piuttosto che nel file di intestazione – Anycorn