クラス テンプレートのコンストラクターを特殊化したい。これは機能しません:
template<typename T>
struct One {};
template<typename T>
struct Two {};
template<template<typename> class T, template<typename> class U>
struct Three : public T<Three<T, U>>, public U<Three<T, U>> {};
template<typename T> struct Four;
template<typename T>
struct Four
{
Four();
};
template<template<typename> class T, template<typename> class U>
Four<Three<T, U>>::Four() {}
int main(int argc, char *argv[])
{
Four<Three<One, Two> > obj;
}
ただし、クラス テンプレートの定義を次のように変更すると機能します。
template<typename T> struct Four;
template<template<typename> class T, template<typename> class U>
struct Four<Three<T, U>>
{
Four();
};
template<template<typename> class T, template<typename> class U>
Four<Three<T, U>>::Four() {}
これは、クラス テンプレート全体を特殊化しているようです。ただし、上記のコードのようにコンストラクターのみを特殊化したいと思います-動作しないものです。Four
for justのコンストラクターを特殊化できないのはなぜですかThree
(クラス テンプレートの ctor の署名を変更していません)。