次のコードを見ると、私は3行目に混乱しています。
3行目は基本テンプレートの特別なケースではなく、「クラス過負荷」のようです。しかし、それは正常にコンパイルすることができます。
行7のobj1は、行3にしたがって定義されていますが、コンパイルに失敗しました。
どうしてですか?
C++クラステンプレートの専門化の質問
template<typename S,int T, void(* U)()> class Bar{}; // Base template
template<int T, void(* U)()> class Bar<double, T, U>{}; // Specialization, which is good
template<int T, void(* U)()> class Bar<double, U, T>{}; // Also good, how come?
void func(){};
int main(){
//Bar<double, func, 1> obj1; // Error, from line 3
}
コンパイラはいつ呼び出すべきですか? 4行目に別の行を追加すると、template class Bar {};これは使用されず、コンパイラーはインスタンス化されませんが、コンパイルに失敗しました。 –
@John、私が言ったように、あなたがその型のインスタンスを宣言しようとすると(obj1の行のコメントを外すように)(その時点でインスタンス化しようとすると)それは文句を言うでしょう。あなたがしなければ、それはテンプレートの美しさです... – Nim
@John、それは別の問題です。そこには 'Bar'よりも多くのテンプレートパラメータがあります。 – Nim