আমি যখন বিভিন্ন অবজেক্ট ফাইলগুলিতে বিশেষায়িত টেম্পলেট ব্যবহার করি, লিঙ্ক করার সময় আমি একটি "বহু সংজ্ঞা" ত্রুটি পাই। আমি যে সমাধান পেয়েছি তার মধ্যে কেবলমাত্র "ইনলাইন" ফাংশনটি ব্যবহার করা জড়িত তবে এটি কেবল কিছুটা কাজের মতো মনে হচ্ছে। "ইনলাইন" কীওয়ার্ডটি ব্যবহার না করে কীভাবে আমি এটি সমাধান করব? যদি তা সম্ভব না হয় তবে কেন?
উদাহরণ কোডটি এখানে:
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
শেষ অবধি:
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
যদি আমি হ্যালো। H এর অভ্যন্তরে "ইনলাইন" কে অসম্পূর্ণ করে রাখি, কোডটি সংকলন এবং চলবে, তবে এটি কেবল আমার কাছে একরকম "workaround" বলে মনে হচ্ছে: বিশেষায়িত ফাংশনটি যদি বড় হয় এবং বহুবার ব্যবহৃত হয় তবে কী হবে? আমি একটি বড় বাইনারি পাবেন? এটি করার অন্য কোনও উপায় আছে? যদি হ্যাঁ, কিভাবে? তা না হলে কেন?
আমি উত্তরগুলি সন্ধান করার চেষ্টা করেছি, তবে আমার কাছে যা কিছু পেয়েছে তা কোনও ব্যাখ্যা ছাড়াই "ইনলাইন ব্যবহার করুন"।
ধন্যবাদ