2017-03-15 31 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 
} 
関連する問題