专门化codecvt:第三个模板参数不是std :: mbstate_t时的链接器错误

时间:2011-11-28 07:46:53

标签: c++ locale codecvt

鉴于

#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 *&amp;,char const *,char const *,char const *&amp;,char *,char *,char *&amp;)const',对所有do_ *成员函数重复。

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

1 个答案:

答案 0 :(得分:4)

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