Wenn ich eine spezielle Vorlage in verschiedenen Objektdateien verwende, wird beim Verknüpfen ein Fehler "Mehrfachdefinition" angezeigt. Die einzige Lösung, die ich gefunden habe, ist die Verwendung der "Inline" -Funktion, aber es scheint nur eine Problemumgehung zu sein. Wie löse ich das, ohne das Schlüsselwort "inline" zu verwenden? Wenn das nicht möglich ist, warum?
Hier ist der Beispielcode:
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
Schließlich:
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
Wenn ich das "Inline" in hello.h auskommentiere, wird der Code kompiliert und ausgeführt, aber das scheint mir nur eine Art "Problemumgehung" zu sein: Was ist, wenn die spezialisierte Funktion groß ist und oft verwendet wird? Bekomme ich eine große Binärdatei? Gibt es eine andere Möglichkeit, dies zu tun? Wenn ja, wie? Wenn nicht, warum?
Ich habe versucht, nach Antworten zu suchen, aber alles, was ich bekam, war "Inline verwenden" ohne weitere Erklärung.
Vielen Dank