2017-03-15 2 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 
    // 
} 

Pourquoi une valeur template template parameter ne peut-elle pas être définie par défaut?Pourquoi un paramètre de modèle de modèle ne peut-il pas être défini par défaut?

+2

Si vous lisez le message d'erreur, il dit que "un paramètre de modèle de template doit être *** un template de classe ***". 'std :: basic_string' par lui-même * est * un template de classe. 'std :: basic_string , std :: allocateur >' n'est * pas * un template, c'est une classe concrète dérivée du template 'std :: basic_string'. –

Répondre

4

Essayez avec

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>> est un simple typename; si vous voulez un template<typename, typename, typename> class, vous devez jeter les arguments de modèle et utiliser le squelette: std::basic_string

+0

cela ne fonctionne que pour les implémentations 'StringType' comme la STL. Ne fonctionnera pas pour, par exemple, 'const CharType *' – virgesmith

+0

@virgesmith - désolé mais je ne comprends pas ce que vous voulez dire; S'il vous plaît, pourriez-vous s'il vous plaît préparer un exemple et le poste est une question? – max66

+0

Vous avez imposé que StringType est un modèle qui prend 3 paramètres, par exemple. f ne peut pas être instancié. Voir ma réponse ci-dessous. – virgesmith

2

Sinon, cela est moins restrictive sur la mise en œuvre de 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 
}