Farklı nesne dosyalarında özel bir şablon kullandığımda, bağlantı kurarken "çoklu tanımlama" hatası alıyorum. Bulduğum tek çözüm "satır içi" işlevini kullanmakla ilgili, ancak bu geçici bir çözüm gibi görünüyor. Bunu "satır içi" anahtar kelimesini kullanmadan nasıl çözebilirim? Bu mümkün değilse neden?
İşte örnek kod:
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
En sonunda:
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
Hello.h içindeki "satır içi" açıklamasını kaldırırsam, kod derlenecek ve çalışacak, ancak bu bana bir tür "geçici çözüm" gibi görünüyor: ya özel işlev büyükse ve birçok kez kullanılıyorsa? Büyük bir ikili alacak mıyım? Bunu yapmanın başka bir yolu var mı? Varsa nasıl? Değilse neden?
Cevapları aramaya çalıştım, ancak sahip olduğum tek şey daha fazla açıklama yapmadan "satır içi kullanım" oldu.
Teşekkürler