2010-11-24 5 views
2

Je suis en train de convertir wstring en chaîne avec l'utilisation de facettes locale, mais je me suis bloqué en cas d'erreur suivante:'std char virtuel :: ctype <wchar_t> :: do_narrow (wchar_t, char) const' est protégé

test_facet.cpp: In function ‘int main()’: 
test_facet.cpp:14: error: invalid initialization of reference of type ‘std::ctype<wchar_t>&’ from expression of type ‘const std::ctype<wchar_t>’ 
/usr/include/c++/4.4/bits/locale_facets.h:1430: error: ‘virtual char std::ctype<wchar_t>::do_narrow(wchar_t, char) const’ is protected 
test_facet.cpp:16: error: within this context 

Source:

#include <iostream> 
#include <string> 
#include <locale> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
locale loc(""); 
std::wstring Str = L"ěščřžýáíé"; 
std::string Str2; 
ctype<wchar_t> &ct = std::use_facet<std::ctype<wchar_t> >(loc); 
for(std::wstring::const_iterator It = Str.begin(); It < Str.end(); ++It) 
    ct.do_narrow(*It, 'X'); 
std::cout << Str2 <<std::endl; 
} 

quelqu'un pourrait-il me dire ce que je suis dooing mal?

Merci

Répondre

0

2 choses:

1) use_facet les rendements de référence à Const, donc vous ne pouvez pas l'affecter à un non-const. Donc, déclarer ct comme:

const ctype<wchar_t> &ct = .... 

2) Comme le second états de message d'erreur, do_narrow est protégé, ce qui rend inaccessible aux appelants externes. Utilisez plutôt narrow, qui est public.

+0

merci pour la réponse, en quelque sorte j'ai raté tous les membres du public de ctype et regardé seulement sur les protégés :(idiote moi – Trakhan

0

Vous ne pouvez pas invoquer do_narrow de ce contexte. Seules les méthodes membres de la classe ctype (et dérivées) peuvent appeler do_narrow.

Questions connexes