当第三个模板参数不是std::mbstate_t时,专门处理codecvt:链接器错误

Specializing codecvt: linker errors when third template argument is not std::mbstate_t

本文关键字:mbstate 错误 链接 codecvt 处理 std 三个 参数      更新时间:2023-10-16

给定

#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 for 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*,char*&const"的引用,对所有do_*成员函数重复。

当StateT不是std::mbstate_t时,编译还需要哪些专业化才能工作?

除了标准要求的两个专门化:codecvt<wchar_t, char, mbstat_t>codecvt<char, char, mbstate_t>之外,codecvt很可能从未实现。很难有一个进行编码转换的通用方法。因此,如果您想使用自己的模板专业化,您可能必须自己实现codecvt的每个函数(可能包括它的基类(。