2017-03-15 109 views
1
#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被默认?为什么不能默认模板模板参数?

+2

如果你读了错误消息,它说, “模板模板参数必须是***类模板***”。 * std :: basic_string *本身就是一个类模板。 'std :: basic_string ,std :: allocator >'*不是*模板,它是从'std :: basic_string'模板派生的具体类。 –

回答

4

尝试用

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

+0

这只适用于像STL这样的'StringType'实现。不适用于例如'const CharType *' – virgesmith

+0

@virgesmith - 抱歉,但我不明白你的意思;请,请你准备一个例子和帖子是一个问题? – max66

+0

您已经强制该StringType是一个需要3个参数的模板,例如f 不能被实例化。请参阅下面的答案。 – virgesmith

2

或者,这是对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 
}