Специализированный 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
(возможно, включая его базовые классы) самостоятельно.