这不是无关紧要的。而且,inline
默认情况下,并非每个功能模板都是默认的。在显式专业化中,该标准甚至是明确的([temp.expl.spec])
具有以下内容:
抄送
#include "tpl.h"
抄送
#include "tpl.h"
tpl.h(摘自Explicit Specialization):
#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 ++模板:完整指南)。