为什么不能默认模板模板参数?
Why cannot a template template parameter be defaulted?
#include <string>
template
<
typename CharType,
template<class, class, class> class StringType = std::basic_string
<CharType, std::char_traits<CharType>, std::allocator<CharType>>
>
void f(CharType, StringType)
{}
int main()
{
char c;
std::string str;
f(c, str);
//
// error : default template argument for
// a template template parameter must be a class template
//
}
为什么 template template parameter
不能默认?
试试
template
<
typename CharType,
template<class, class, class> class StringType = std::basic_string
>
void f(CharType, StringType<CharType, std::char_traits<CharType>,
std::allocator<CharType>>)
{}
std::basic_string<CharType, std::char_traits<CharType>, std::allocator<CharType>>
是一个简单的类型名;如果你想要 template<typename, typename, typename> class
,你必须扔掉模板参数并使用框架:std::basic_string
或者,这对 StringType 实现的限制较少:
#include <string>
template
<
typename CharType,
typename StringType = std::basic_string<CharType,std::char_traits<CharType>,std::allocator<CharType>>
>
void f(CharType, StringType)
{
}
int main()
{
char c;
std::string str;
f(c, str);
const char* cstring;
f(c, cstring); // also works
}
#include <string>
template
<
typename CharType,
template<class, class, class> class StringType = std::basic_string
<CharType, std::char_traits<CharType>, std::allocator<CharType>>
>
void f(CharType, StringType)
{}
int main()
{
char c;
std::string str;
f(c, str);
//
// error : default template argument for
// a template template parameter must be a class template
//
}
为什么 template template parameter
不能默认?
试试
template
<
typename CharType,
template<class, class, class> class StringType = std::basic_string
>
void f(CharType, StringType<CharType, std::char_traits<CharType>,
std::allocator<CharType>>)
{}
std::basic_string<CharType, std::char_traits<CharType>, std::allocator<CharType>>
是一个简单的类型名;如果你想要 template<typename, typename, typename> class
,你必须扔掉模板参数并使用框架:std::basic_string
或者,这对 StringType 实现的限制较少:
#include <string>
template
<
typename CharType,
typename StringType = std::basic_string<CharType,std::char_traits<CharType>,std::allocator<CharType>>
>
void f(CharType, StringType)
{
}
int main()
{
char c;
std::string str;
f(c, str);
const char* cstring;
f(c, cstring); // also works
}