Ketika saya menggunakan template khusus di file objek yang berbeda, saya mendapatkan kesalahan "definisi ganda" saat menghubungkan. Satu-satunya solusi yang saya temukan melibatkan penggunaan fungsi "inline", tetapi sepertinya ada beberapa solusi. Bagaimana cara mengatasinya tanpa menggunakan kata kunci "sebaris"? Jika itu tidak memungkinkan, mengapa?
Berikut adalah contoh kode:
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
Akhirnya:
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
Jika saya menghapus komentar "inline" di dalam hello.h, kode akan dikompilasi dan dijalankan, tetapi itu sepertinya semacam "solusi" bagi saya: bagaimana jika fungsi khusus besar dan digunakan berkali-kali? Apakah saya akan mendapatkan biner besar? Apakah ada cara lain untuk melakukan hal ini?. Jika ya, bagaimana caranya? Jika tidak, mengapa?
Saya mencoba mencari jawaban, tetapi yang saya dapatkan hanyalah "gunakan sebaris" tanpa penjelasan lebih lanjut.
Terima kasih