1

クラス テンプレートのコンストラクターを特殊化したい。これは機能しません:

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() {}

これは、クラス テンプレート全体を特殊化しているようです。ただし、上記のコードのようにコンストラクターのみを特殊化したいと思います-動作しないものです。Fourfor justのコンストラクターを特殊化できないのはなぜですかThree(クラス テンプレートの ctor の署名を変更していません)。

4

1 に答える 1