Given
#include <locale>
struct Q;
struct R{ void operator()(Q*) { } };
class S : public std::codecvt<char, char, Q*> { } ;
int main() {
    char *p;
    char *q;
    const char *r;
    char *s;
    char *t;
    char *u;
    Q* _q;
    std::use_facet<std::codecvt<char, char, Q*> >(std::locale(std::locale::classic(), new S)).in(_q, p, q, r, s, t, u);
}
The linker dies with the messages
[vtable for std::codecvt]+0x50): undefined reference to 'std::codecvt::do_max_length() const', repeated for all the codecvt do_* members, and
[vtable for S]+0x20): undefined reference to 'std::codecvt::do_out(Q*&, char const*, char const*, char const*&, char*, char*, char*&) const', repeated for all the do_* member functions.
When StateT is not std::mbstate_t, which specializations are further required for compilation to work?
                        
It is highly possible that
codecvtis never implemented except for the two specialization required by the standard:codecvt<wchar_t, char, mbstat_t>andcodecvt<char, char, mbstate_t>. It is very hard to have a general way of doing encoding conversion. So if you want use your own template specialization, you may have to implement every function ofcodecvt(maybe including its base classes) yourself.