Специализированный codecvt: ошибки компоновщика, когда третий аргумент шаблона не является std::mbstate_t

Дано

#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);
}

Линкер умирает с сообщениями

[vtable для std::codecvt]+0x50): неопределенная ссылка на 'std::codecvt::do_max_length() const', повторяется для всех членов codecvt do_ * и

[vtable for S]+0x20): неопределенная ссылка на 'std::codecvt::do_out(Q*&, char const*, char const*, char const*&, char*, char*, char*&) const', повторяется для всех функций-членов do_ *.

Когда StateT не std::mbstate_tКакие специализации необходимы для работы компиляции?

1 ответ

Решение

Весьма возможно, что codecvt никогда не реализуется, за исключением двух специализаций, требуемых стандартом: codecvt<wchar_t, char, mbstat_t> а также codecvt<char, char, mbstate_t>, Очень сложно иметь общий способ преобразования кодировки. Поэтому, если вы хотите использовать собственную специализацию шаблонов, вам, возможно, придется реализовать все функции codecvt (возможно, включая его базовые классы) самостоятельно.

Другие вопросы по тегам