Proposed resolution:
Change section 22.2.1.2 (lib.locale.ctype.byname) to become:
namespace std { template <class charT> class ctype_byname : public ctype<charT> { public: typedef ctype<charT>::mask mask; explicit ctype_byname(const char*, size_t refs = 0); protected: ~ctype_byname(); // virtual }; }
Change section 22.2.1.6 (lib.locale.codecvt.byname) to become:
namespace std { template <class internT, class externT, class stateT> class codecvt_byname : public codecvt<internT, externT, stateT> { public: explicit codecvt_byname(const char*, size_t refs = 0); protected: ~codecvt_byname(); // virtual }; }
Change section 22.2.3.2 (lib.locale.numpunct.byname) to become:
namespace std { template <class charT> class numpunct_byname : public numpunct<charT> { // this class is specialized for char and wchar_t. public: typedef charT char_type; typedef basic_string<charT> string_type; explicit numpunct_byname(const char*, size_t refs = 0); protected: ~numpunct_byname(); // virtual }; }
Change section 22.2.4.2 (lib.locale.collate.byname) to become:
namespace std { template <class charT> class collate_byname : public collate<charT> { public: typedef basic_string<charT> string_type; explicit collate_byname(const char*, size_t refs = 0); protected: ~collate_byname(); // virtual }; }
Change section 22.2.5.2 (lib.locale.time.get.byname) to become:
namespace std { template <class charT, class InputIterator = istreambuf_iterator<charT> > class time_get_byname : public time_get<charT, InputIterator> { public: typedef time_base::dateorder dateorder; typedef InputIterator iter_type
explicit time_get_byname(const char*, size_t refs = 0); protected: ~time_get_byname(); // virtual }; }
Change section 22.2.5.4 (lib.locale.time.put.byname) to become:
namespace std { template <class charT, class OutputIterator = ostreambuf_iterator<charT> > class time_put_byname : public time_put<charT, OutputIterator> { public: typedef charT char_type; typedef OutputIterator iter_type;
explicit time_put_byname(const char*, size_t refs = 0); protected: ~time_put_byname(); // virtual }; }"
Change section 22.2.6.4 (lib.locale.moneypunct.byname) to become:
namespace std { template <class charT, bool Intl = false> class moneypunct_byname : public moneypunct<charT, Intl> { public: typedef money_base::pattern pattern; typedef basic_string<charT> string_type;
explicit moneypunct_byname(const char*, size_t refs = 0); protected: ~moneypunct_byname(); // virtual }; }
Change section 22.2.7.2 (lib.locale.messages.byname) to become:
namespace std { template <class charT> class messages_byname : public messages<charT> { public: typedef messages_base::catalog catalog; typedef basic_string<charT> string_type;
explicit messages_byname(const char*, size_t refs = 0); protected: ~messages_byname(); // virtual }; }
Remove section [locale.codecvt] completely (because in this case only those members are defined to be virtual which are defined to be virtual in 'ctype<cT>'.)