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

С учетом

#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 Ответ

4 голосов
/ 28 ноября 2011

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

...