クラスのtemplate
専門化を比較する手順は何ですか? この点に関する標準の詳細はありません (または、適切な場所がありません)。
私の質問は、インスタンス化中に使用する専門化を決定することとは何の関係もありません。それについてはコメントしないでください。問題は、専門化を互いに比較して、特定の専門化がすでに定義されているかどうかを判断することです。
次のサンプル コードを検討してください。
template <class x1, class x2>
struct CoreTemplate { };
template <class x1, class x2>
struct CoreTemplate<x1*, x2*> { int spec; CoreTemplate() { spec = 1; } };
template <class x1, class x2>
struct CoreTemplate<x2*, x1*> { int spec; CoreTemplate() { spec = 2; } };
int main(int argc, char* argv[])
{
CoreTemplate<int*, int*> qq;
printf("var=%d.\r\n", qq.spec);
}
このコードを MSVC でコンパイルしようとすると、main
関数内でのインスタンス化の試行でエラーが発生します。
cpptest1.cxx(15): エラー C2752: '
CoreTemplate<x1,x2>
': 複数の部分的な特殊化がテンプレート引数リストと一致します
私にとっては、同一のテンプレートの特殊化を宣言しようとすると、エラーを発行する方が論理的です。上記の専門分野に違いはありません。
では、テンプレートの特殊化を比較するルールを知っている人はいますか? 記事、リンク、書籍なども役立ちます。