web-dev-qa-db-ja.com

「template <>」と「括弧なしの「template」-違いは何ですか?

私が宣言したと仮定します:

template <typename T> void foo(T& t);

さて、の違いは何ですか

template <> void foo<int>(int& t);

そして

template void foo<int>(int& t);

意味的に?また、ブラケットなしのテンプレートと空ブラケット付きのテンプレートには、他のコンテキストで他のセマンティクスがありますか?


関連する: C++テンプレートの特定のインスタンスをインスタンス化する方法

71
einpoklum

template <> void foo<int>(int& t);は、テンプレートの特殊化を宣言しますが、本文は異なる可能性があります。

template void foo<int>(int& t);は、テンプレートの明示的なインスタンス化を引き起こしますが、特殊化を導入しません。特定のタイプのテンプレートのインスタンス化を強制します。

66
Mark B

クラス/構造で、

template <typename T> struct foo {};

専門分野は次のとおりです。

template <> struct foo<int>{};

以下は明示的なインスタンス化です。

template struct foo<int>;
12
Jarod42