それは無関係ではありません。いいえ、すべての関数テンプレートが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 ++テンプレート:完全ガイドに準拠しています)。