다른 개체 파일에서 특수 템플릿을 사용하면 연결할 때 "다중 정의"오류가 발생합니다. 내가 찾은 유일한 해결책은 "인라인"기능을 사용하는 것이지만 일부 해결 방법처럼 보입니다. "인라인"키워드를 사용하지 않고 어떻게 해결합니까? 가능하지 않다면 왜?
다음은 예제 코드입니다.
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
hello.h 내부의 "인라인"의 주석 처리를 제거하면 코드가 컴파일되고 실행되지만 일종의 "해결 방법"처럼 보입니다. 특수 함수가 크고 여러 번 사용되면 어떻게 될까요? 큰 바이너리를 얻을 수 있습니까? 이 작업을 수행하는 다른 방법이 있습니까? 그렇다면 어떻게? 그렇지 않다면 왜?
답을 찾아 보려고했지만 추가 설명없이 "인라인으로 사용"하는 것이 전부였습니다.
감사