'виртуальный символ std :: ctype:: do_narrow (wchar_t, char) const 'защищен - PullRequest
2 голосов
/ 24 ноября 2010

Я пытаюсь преобразовать wstring в строку с использованием локали, но я застрял при следующей ошибке:

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

Источник:

#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;
}

Может кто-нибудь сказать мне,что я не правильно делаю?

спасибо

Ответы [ 2 ]

0 голосов
/ 24 ноября 2010

2 вещи:

1) use_facet возвращает ссылку на const, поэтому вы не можете присвоить ее неконстантной.Поэтому объявите ct как:

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

2) Как указано во втором сообщении об ошибке, do_narrow защищено, что делает его недоступным для внешних абонентов.Вместо этого используйте narrow, который является общедоступным.

0 голосов
/ 24 ноября 2010

Вы не можете вызвать do_narrow из этого контекста.Только методы-члены класса ctype (и производные) могут вызывать do_narrow.

...