2011-11-28 48 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