模板默认参数
Template default argument
如何将模板 class 指定为模板类型名称的默认值?例如以下无效。
template <typename A, typename B> class X {};
template <typename T=template <typename, typename> class X> class Y {};
int main()
{
Y<> y;
return 0;
}
tmp.cc:4:22: error: expected type-specifier before ‘template’
template <typename T=template <typename, typename> class X> class Y {};
^~~~~~~~
tmp.cc:4:22: error: expected ‘>’ before ‘template’
tmp.cc: In function ‘int main()’:
tmp.cc:8:7: error: template argument 1 is invalid
Y<> y;
^
您的代码的问题在于,对于 Y
,您询问了 type 模板参数,并且您想使用 template模板参数。
template <typename A, typename B> class X {};
// type template template
//........VVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
template <typename T=template <typename, typename> class X> class Y {};
int main()
{
Y<> y;
return 0;
}
如果要使用X
作为默认值,T
必须是模板模板,所以
template <typename, typename>
class X
{};
template <template <typename, typename> class T = X>
class Y
{};
int main ()
{
Y<> y;
}
或者也可以使用可变参数来提高灵活性
template <template <typename...> class T = X>
class Y
{};
如何将模板 class 指定为模板类型名称的默认值?例如以下无效。
template <typename A, typename B> class X {};
template <typename T=template <typename, typename> class X> class Y {};
int main()
{
Y<> y;
return 0;
}
tmp.cc:4:22: error: expected type-specifier before ‘template’
template <typename T=template <typename, typename> class X> class Y {};
^~~~~~~~
tmp.cc:4:22: error: expected ‘>’ before ‘template’
tmp.cc: In function ‘int main()’:
tmp.cc:8:7: error: template argument 1 is invalid
Y<> y;
^
您的代码的问题在于,对于 Y
,您询问了 type 模板参数,并且您想使用 template模板参数。
template <typename A, typename B> class X {};
// type template template
//........VVVVVVVVVV VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
template <typename T=template <typename, typename> class X> class Y {};
int main()
{
Y<> y;
return 0;
}
如果要使用X
作为默认值,T
必须是模板模板,所以
template <typename, typename>
class X
{};
template <template <typename, typename> class T = X>
class Y
{};
int main ()
{
Y<> y;
}
或者也可以使用可变参数来提高灵活性
template <template <typename...> class T = X>
class Y
{};