std C++ v3 locale, messages непонятность

Hottab

почему, если do_open объявлена как virtual,a
catalog open(const basic_string<char>& __s, const locale& __loc) const
{ return this->do_open(__s, __loc); }
"do_open call" не видно в выводе проги


#include <iostream>
#include <locale>
#include <string>
#include <stdlib.h>
using namespace std;
class msg_localization: public std::messages<char>
{public:
catalog do_open(const std::string&,const std::locale&)const
{cout<<"do_open call\n"; return -1;}
};
int main(int argc, char *argv[])
{
const messages<char>& m=use_facet<msg_localization>(locale;
m.open("./msgdir/",locale;
system("PAUSE");
return 0;
}

freezer

потому что в любом случае use_facet возвращает ссылку на объект класса message<>.
Можно правда сделать такой хак:


class msg_localization: public std::messages<char>
{
protected:
virtual catalog do_open(const std::string&,const std::locale&)const
{
cout<<"do_open call\n";
return -1;
}
public: // содрано с <xlocmes> с небольшим исправлением
static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT msg_localization;
return (_X_MESSAGE);
}
};

Hottab

не прокатывает фишка ни под dev-cpp (порт gcc под win) ни под MSVC++ .NET 2003
тфу!
начал разбираться с v3 под руководством страуса, а тут самплес компилится, но работает не правильно и в gcc и визуале

freezer

как не прокатывает? Я перед тем как выкладывать в MSVC++ .NET 2003 запустил!
Вот полный код:
// loc.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <locale>
#include <string>
#include <stdlib.h>
using namespace std;
class msg_localization: public std::messages<char>
{
protected:
virtual catalog do_open(const std::string&,const std::locale&)const
{
cout<<"do_open call\n";
return -1;
}
public:
static size_t __cdecl _Getcat(const locale::facet **_Ppf = 0)
{ // return locale category mask and construct standard facet
if (_Ppf != 0 && *_Ppf == 0)
*_Ppf = _NEW_CRT msg_localization;
return (_X_MESSAGE);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
const messages<char>& m=use_facet<msg_localization>(locale;
m.open("./msgdir/",locale;
system("PAUSE");
return 0;
}
Оставить комментарий
Имя или ник:
Комментарий: