무관하지 않습니다. 아니요, 모든 기능 템플릿이 inline
기본적으로 제공되는 것은 아닙니다 . 표준은 명시 적 전문화 ([temp.expl.spec]) 에서도 명시 적입니다.
다음이 있어야합니다.
a.cc
#include "tpl.h"
b.cc
#include "tpl.h"
tpl.h (명시 적 전문화에서 가져옴 ) :
#ifndef TPL_H
#define TPL_H
template<class T> void f(T) {}
template<class T> inline T g(T) {}
template<> inline void f<>(int) {} // OK: inline
template<> int g<>(int) {} // error: not inline
#endif
이것을 컴파일하십시오.
g++ a.cc b.cc
/tmp/ccfWLeDX.o: In function `int g<int>(int)':
inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
/tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status
inline
명시 적 인스턴스화를 수행 할 때 명시 하지 않으면 문제가 발생할 수도 있습니다.
요약하자면 : 완전히 전문화되지 않은 함수 템플릿, 즉 하나 이상의 알 수없는 유형을 포함하는 템플릿의 경우를 생략 inline
하고 오류를 수신 할 수 없지만 여전히 그렇지 않습니다 inline
. 전체 전문화의 경우, 즉 알려진 유형 만 사용하는 경우 생략 할 수 없습니다.
제안 된 경험 법칙 : inline
의미가 있으면 작성 하고 일관성을 유지하십시오. 그것은 당신이 할 수 있기 때문에 할 것인지 말 것인지에 대해 덜 생각하게 만듭니다. (이 경험 법칙은 Vandevoorde / Josuttis의 C ++ 템플릿 : The Complete Guide를 준수합니다 .)