それは無関係ではありません。いいえ、すべての関数テンプレートが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
ことも、問題につながる可能性があります。
要約すると、完全に特殊化されていない関数テンプレート、つまり、少なくとも1つの不明なタイプを持つテンプレートの場合、を省略inline
してエラーを受け取らないようにすることができますが、それでもエラーは発生しませんinline
。完全な特殊化、つまり既知のタイプのみを使用する特殊化の場合、それを省略することはできません。
提案された経験則:inline
あなたがそれを意味し、ただ一貫している場合は書いてください。それはあなたができるという理由だけで生きるべきかどうかについて考えることを少なくします。(この経験則は、Vandevoorde /JosuttisのC++テンプレート:完全ガイドに準拠しています)。