¿Cómo puedo usar std :: imbue para establecer la configuración regional de std :: wcout?

Estoy tratando de usar elstd::locale mecanismo en C ++ 11 para contar palabras en diferentes idiomas. Específicamente, tengostd::wstringstream que contiene el título de una famosa novela rusa ("Crimen y castigo" en inglés). Lo que quiero hacer es usar la configuración regional adecuada (ru_RU.utf8 en mi máquina Linux) para leer el flujo de cadena, contar las palabras e imprimir los resultados. Probablemente también debería tener en cuenta que mi sistema está configurado para usar elen_US.utf8 lugar.

El resultado deseado es este:

0: "Преступление"
1: "и"
2: "наказание"

I counted 3 words.
and the last word was "наказание"

Todo eso funciona cuando configuro la configuración regional global, pero no cuando intentoimbue elwcout corriente. Cuando intento eso, obtengo este resultado en su lugar:

0: "????????????"
1: "?"
2: "?????????"

I counted 3 words.
and the last word was "?????????"

Además, cuando intento usar una solución sugerida en los comentarios, (que se puede activar cambiando#define USE_CODECVT 0 a#define USE_CODECVT 1) Me sale el error mencionado enesta otra pregunta.

Aquellos interesados en experimentar con el código, o con la configuración del compilador o ambos, pueden desear usareste código en vivo.

Mis preguntas¿Por qué eso no funciona? Es porquewcout ya esta abierto?¿Hay forma de usarimbue en lugar de establecer la configuración regional global para hacer lo que quiero?

Si hace la diferencia, estoy usando g ++ 4.8.3. El código completo se muestra a continuación.

getwords.cpp
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <locale>

#define USE_CODECVT 0
#define USE_IMBUE   1

#if USE_CODECVT
#include <codecvt>
#endif 
using namespace std;

int main()
{
#if USE_CODECVT
    locale ru("ru_RU.utf8", 
        new codecvt_utf8<wchar_t, 0x10ffff, consume_header>{});
#else
    locale ru("ru_RU.utf8");
#endif
#if USE_IMBUE
    wcout.imbue(ru);
#else
    locale::global(ru);
#endif
    wstringstream in{L"Преступление и наказание"};
    in.imbue(ru);
    wstring word;
    unsigned wordcount = 0;
    while (in >> word) {
        wcout << wordcount << ": \"" << word << "\"\n";
        ++wordcount;
    }
    wcout << "\nI counted " << wordcount << " words.\n"
        << "and the last word was \"" << word << "\"\n";
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta