非テンプレート クラスにメンバ関数テンプレートがあり、それをクラス外で定義したい場合、「インライン」を使用する必要がありますか?
例:
class A
{
template <class D>
void someMethod(D param);
}
template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}
標準のセクション 3.2.5 は、関数テンプレートは 1 つの定義規則に該当しないと述べています。この点で、メンバー関数テンプレートは関数テンプレートですか?
編集:リンカーはインラインなしで文句を言いませんが、それでも有効な C++03 ですか?
編集:
これまでに学んだこと: gcc (およびおそらく他のコンパイラも) は、暗黙的なテンプレートのインスタンス化をウィークシンボルとしてエクスポートします。つまり、複数の翻訳単位でインスタンス化されている場合、リンク時に競合は発生しません。弱いシンボルは標準の一部ではないため、標準ではテンプレートのインスタンス化がこのように動作することを暗黙のうちに要求していますか?他の標準準拠のコンパイラ/リンカーの組み合わせで同じ動作を期待できますか?
インラインは最適化のために基本的に無視されますが、異なる翻訳単位で関数の複数の定義を許可するため、これは暗黙的にこれらの関数を弱いシンボルとしてエクスポートすることに変換されます。これは、テンプレートをインラインとして宣言することは冗長であることを意味しますか?