2011-11-28 47 views
1

鉴于专业的codecvt:链接错误时第三模板参数不标准::的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); 
} 

接头与所述消息

[虚函数表为标准::的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,编译工作还需要哪些专业化?

回答

4

极有可能codecvt永远不会实现,除了标准要求的两个专业化:codecvt<wchar_t, char, mbstat_t>codecvt<char, char, mbstate_t>。使用编码转换的一般方法非常困难。所以如果你想使用你自己的模板专业化,你可能必须自己实现codecvt(可能包括它的基类)的每个功能。

+0

因此,我不必专注于'codecvt ',我必须从'codecvt_base'开始一路? – moshbear

+0

我检查'codecvt'的基类,它们是'codecvt_base'和'facet',并且发现它们都不是模板。所以你不需要改变它们。 – fefe

+0

也许我应该打开一个libstdC++ bugreport,以便cvt通用模板具有'return noconv'存根,而不仅仅是原型。 – moshbear