8

テンプレート化されたクラスのメソッドはリンケージを暗示inlineしていますか(インライン最適化については話していません)、それとも単にテンプレート化されたメソッドですか?

// A.h

template<typename T>
class A
{
public:
    void func1();                       //  #1
    virtual void func2();               //  #2
    template<typename T2> void func3(); //  #3
};

template<typename T>
void A<T>::func1(){}    //  #1

template<typename T>
void A<T>::func2(){}    //  #2

template<typename T>
template<typename T2>
void A<T>::func3<T2>(){}    //  #3

上記のケースはすべてinline【リンケージ】ですか?inline(それらのいずれかについて明示的に書く必要がありますか)?

4

1 に答える 1

15

テンプレート関数とテンプレート クラスのメンバー関数は、暗黙的にインスタンス化されている場合は暗黙的にインライン1ですが、テンプレートの特殊化はそうではないことに注意してください。

template <typename T>
struct test {
    void f();
}
template <typename T>
void test<T>::f() {}           // inline

template <>
void test<int>::f() {}           // not inline

より良い引用がないため:

エクスポートされていないテンプレートは、対応する特殊化が一部の翻訳単位で明示的にインスタンス化されていない限り (14.7.2)、暗黙的にインスタンス化されているすべての翻訳単位で定義する必要があります (14.7.1)。診断は必要ありません


1複数の定義が許可されているという意味でのみ、最適化目的では許可されていません。inlineそれらをオプティマイザのヒントとして手動でマークできます。

参照[basic.def.odr]/13.4- テンプレート自体が ODR から除外されているのは、それらが暗黙的に であるからではありませんinline

于 2012-07-17T17:14:36.827 に答える