partial-template-specialization



  • ich habe eine klasse:

    template<
       class char_type, 
       class traits_type=std::char_traits<char_type>,
       class allocator_type=std::allocator<char_type>
    >
    class basic_archive{
       static const char_type* mark;
    };
    

    nun will ich einen standartwert für 'mark' setzen:
    (beispiel für char_type == 'char')

    template<class traits_type,class allocator_type>
    const char* basic_archive<char,traits_type,allocator_type>::mark = "mark";
    

    allerdings gibt es einen fehler:

    error C3860: template argument list following class template name must list parameters in the order used in template parameter list

    leider weiß ich nicht wie ich es anders machen sollte und wäre dankbar für eure hilfe 🙂

    PS: vorübergehend habe ich es folgendermaßen gelöst:

    template<class char_type>
    class mark_helper{
       static const char_type* mark;
    };
    template<>
    const char* mark_helper<char>::mark;
    

    und darauf dann in basic_archive zugegriffen, aber das geht doch bestimmt auch schöner 🙄



  • So direkt geht das leider nicht.

    Als allgemein gutes Design würde ich dir allerdings raten, Member, die nur vom char_type abhängen, auszulagern:

    template<class char_type>
    class basic_archive_impl {
      static const char_type* mark;
    };
    template<> const char* basic_archive_impl<char>::mark = "mark";
    
    template<
      class char_type,
      class traits_type=std::char_traits<char_type>,
      class allocator_type=std::allocator<char_type>
      >
    class basic_archive : basic_archive_impl<char_type> {
    };
    

    Einer der Vorteile ist, dass die Funktionen innerhalb von basic_archive_impl nur einmal pro char_type definiert werden, während sie in deinem Ansatz unter Umständen mehrfach vorkommen würden (wegen anderem Trait oder Allocator).



  • s/definiert/instanziiert/



  • okay, also war ich auf dem richtigen weg 🙂
    danke für deine hilfe


Anmelden zum Antworten