1 2 3
Re[3]: сериализация данных в избранное  новое горячее всё    подписка   модер. 
От: Glоbus 
Дата: 14.06.07 07:45
Здравствуйте, k732, Вы писали:

G>>Попробуй сделать обертку над сокетом — например наследованием от basic_streambuf и реализовав там необходимые операции. Тогда у тебя получется создавать объекты стримов и передавать их бусту.


K>нету опыта, поэтому не совсем понятно как должна выглядель полная реализация наследника basic_streambuf


Знач так... Ну вобщем я вот тут накидал примерец — там реализованы не все функции basic_streambuf-a, но читать/писать оно умеет, так что я думаю будет понятно. Мож если кто чего мудрого еще решит добавить — пишите.


1. Реализуем свой буфер для работы с сокетом.
// SockStreamBuf.h

#ifndef CSockStramBuf__H
#define CSockStramBuf__H

#include <iosfwd>
#include <Winsock2.h>
#include <string>

template
    <
    class Elem,
    class Tr = std::char_traits< Elem >
    >
class CSockStreamBuf : public std::basic_streambuf< Elem, Tr >
{
public:
    CSockStreamBuf( const std::string& sAddr, int iPort );
    virtual ~CSockStreamBuf();

    int GetState() const;

    //Implementing basic_streambuf
    int_type pbackfail( int_type =  Tr::eof() );
    std::streamsize xsputn( const char_type *buf, std::streamsize iCount );
    std::streamsize xsgetn( char_type *buf,    std::streamsize iCount );
    std::streamsize _Xsgetn_s( char_type *buf,    size_t iSize, std::streamsize iCount    );




private:
    int Connect( const std::string& sAddr, int iPort );
    bool Disconnect();

    std::string m_sAddr;
    int m_iPort;
    SOCKET m_Sock;
    int m_iState;
};

template< class Elem, class Tr >
typename CSockStreamBuf<Elem,Tr>::int_type CSockStreamBuf<Elem,Tr>::pbackfail(int_type /* = Tr::eof()  */)
{
    return Tr::eof();
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem, Tr >::_Xsgetn_s( char_type *buf,    size_t iSize, std::streamsize iCount    )
{
    std::streamsize iRes = this->xsgetn( buf, iCount );
    return iRes;
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem, Tr >::xsputn( const typename CSockStreamBuf< Elem, Tr >::char_type *buf, std::streamsize iCount )
{
    std::streamsize iRes = send( m_Sock, buf, iCount, 0 );
    return iRes;
}

template< class Elem, class Tr >
std::streamsize CSockStreamBuf< Elem,Tr >::xsgetn( typename CSockStreamBuf< Elem, Tr >::char_type *buf, std::streamsize iCount )
{
    std::streamsize iRes = recv( m_Sock, buf, iCount, 0 );
    return iRes;
}

template< class Elem, class Tr >
CSockStreamBuf<Elem,Tr>::CSockStreamBuf( const std::string& sAddr, int iPort )
{
    this->Connect( sAddr, iPort );
}

template< class Elem, class Tr >
CSockStreamBuf<Elem,Tr>::~CSockStreamBuf()
{
    this->Disconnect();
}


template<class Elem, class Tr>
int CSockStreamBuf<Elem,Tr>::Connect( const std::string& sAddr, int iPort )
{
    //init winsock
    WSADATA wsaData;
    m_iState = WSAStartup(MAKEWORD(2,2), &wsaData);
    if( m_iState == NO_ERROR )
    {
        //creating socket
        SOCKET ConnectSocket;
        ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if( ConnectSocket != INVALID_SOCKET )
        {
            //creating address object
            sockaddr_in sockAddr;
            sockAddr.sin_family = AF_INET;
            sockAddr.sin_addr.s_addr = inet_addr( sAddr.c_str() );
            sockAddr.sin_port = htons( iPort );
            //connecting
            m_iState = connect( ConnectSocket, (SOCKADDR*)&sockAddr, sizeof( sockAddr ) ) ;
            if( m_iState != SOCKET_ERROR )
            {
                m_sAddr = sAddr;
                m_iPort = iPort;
                m_Sock = ConnectSocket;
            }//if
        }//if
        else
        {
            m_iState = SOCKET_ERROR;
        }//else
    }//if
    return m_iState;
}

template< class Elem, class Tr >
bool CSockStreamBuf<Elem,Tr>::Disconnect()
{
    bool bRes = true;
    if( m_Sock != INVALID_SOCKET )
    {
        bRes = closesocket( m_Sock ) == 0; 
        
    }//if
    WSACleanup();
    return bRes;
}



#endif CSockStramBuf__H


2. Используем
#include "stdafx.h"
#include "SockStreamBuf.h"



int main(int argc, char* argv[])
{

CSockStreamBuf< char > sockBuf( "194.67.57.26", 80 ); //это коннект к mail.ru
std::basic_iostream< char > stream( &sockBuf ); //создаем поток и далее работаем уже только сним

std::string sData = "GET http://mail.ru/ HTTP/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\nAccept-Language: ru\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)\r\nHost: localhost\r\nProxy-Connection: Keep-Alive\r\n\r\n";
stream.write( sData.c_str(), sData.length() ); //отсылаем запрос
char buf[1024] = {0};
stream.read( buf, 1024 ); //получаем ответ.

return 0;
}

Удачи тебе, браток!
Re[16]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 08:23
Здравствуйте, Sergey, Вы писали:

S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization.


но тогда для всей этой кухни нет различий от std::ostringstream
А именно от этого я хотел уйти. Ведь зачем городить было огород, если можно было просто загнать буфер
в std::ostringstream ?
Re[16]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 08:30
Здравствуйте, Sergey, Вы писали:

S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization.


попробова. ему не нравится ни то ни другое
Re[17]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 08:35
> S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization.
>
> но тогда для всей этой кухни нет различий от std::ostringstream
> А именно от этого я хотел уйти. Ведь зачем городить было огород, если можно было просто загнать буфер
> в std::ostringstream ?

А я-то думал, что ты стрим над сокетом собирался делать
Posted via RSDN NNTP Server 2.1 beta
Re[17]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 08:36
"k732" <57436@users.rsdn.ru> wrote in message news:2545524@news.rsdn.ru...
> Здравствуйте, Sergey, Вы писали:
>
> S>А чтобы скомпилировалось, должен быть просто char — либо вместо std::ostream надо использовать std::basic_ostream<unsigned char> — но не факт, что последнее понравится boost::serialization.
>
> попробова. ему не нравится ни то ни другое

Тогда показывай определение класса container_stream.
Posted via RSDN NNTP Server 2.1 beta
Re[18]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 09:19
Здравствуйте, Sergey, Вы писали:

S>А я-то думал, что ты стрим над сокетом собирался делать


Так я так и не понял как читадь данные из потока, если неизвестна длигга данных.
Пока делаю только с дополнительным заголовком фиксированного размера
Re[18]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 09:21
Оценка:3 (1)
Здравствуйте, Sergey, Вы писали:

S>Тогда показывай определение класса container_stream.


Примерно так
разделил классы

template<typename Container>
class rcontainer {
private:
    typedef typename Container::size_type   size_type;
    const Container&  m_container;
    size_type   m_index;

public:
    typedef typename Container::value_type    char_type;
    typedef boost::iostreams::source_tag    category;

    rcontainer (const Container& container) : m_container(container), m_index(0) { }
    ~rcontainer () { }

    std::streamsize read (char_type* value, std::streamsize size)
    {
        std::streamsize delta = static_cast<std::streamsize> (
            m_container.size() - m_index
        );

        std::streamsize result = std::min<std::streamsize> (size, delta);
        if (!result) return -1;

        std::copy (
            m_container.begin() + m_index,
            m_container.begin() + m_index + result, value
        );
        m_index += result;
        return result;
    }
};
/* -------------------------------------------------------------------------- */
template<typename Container>
class wcontainer {
private:
    typedef typename Container::size_type   size_type;
    Container&  m_container;
    size_type   m_index;

public:
    typedef typename Container::value_type    char_type;
    typedef boost::iostreams::sink_tag        category;

    wcontainer (Container& container)  : m_container(container), m_index(0) { }
    ~wcontainer () { }

    std::streamsize write (const char_type* value, std::streamsize size)
    {
        m_container.insert(m_container.end(), value, value + size);
        return size;
    }
};


Теперь парсер (попробуй у него поменять )
typedef std::vector<unsigned char> sbuffer;

на
typedef std::vector<char> sbuffer;


namespace parser
{
    /* ---------------------------------------------------------------------- */
    typedef std::vector<unsigned char> sbuffer;
    typedef rcontainer <sbuffer> rdevice;
    typedef wcontainer <sbuffer> wdevice;
    /* ---------------------------------------------------------------------- */
    template <class T>
    inline void serialize (sbuffer& buffer, const T& rhs)
    {
        try
        {
            namespace bio = boost::iostreams;

            wdevice device (buffer);
            bio::stream_buffer<wdevice> stream (device);
            std::basic_ostream <unsigned char> ostream (&stream);
            //std::ostream ostream (&stream);

            boost::archive::binary_oarchive archive(ostream);
            archive << BOOST_SERIALIZATION_NVP (rhs);

        }
        catch (std::exception& ex)
        {
            std::cerr << ex.what() << std::endl;
        }
    }
    /* ---------------------------------------------------------------------- */
    template <class T>
    inline void deserialize (const sbuffer& buffer, T& rhs)
    {
        try
        {
            namespace bio = boost::iostreams;

            rdevice device (buffer);
            bio::stream_buffer<rdevice> stream (device);
            std::istream istream (&stream);


            boost::archive::binary_iarchive archive (istream);
            archive >> BOOST_SERIALIZATION_NVP (rhs);
        }
        catch (std::exception& ex)
        {
            std::cerr << ex.what() << std::endl;
        }
    }
    /* ---------------------------------------------------------------------- */
}
Re[19]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 10:27
> Теперь парсер (попробуй у него поменять )
>
> typedef std::vector<unsigned char> sbuffer;
>

> на
>
> typedef std::vector<char> sbuffer;
>


Если заодно не забыть поменять и std::basic_ostream <unsigned char> ostream (&stream); на std::ostream ostream (&stream);то все замечательно скомпилируется. По крайней мере, на MSVC 8 sp1.
Posted via RSDN NNTP Server 2.1 beta
Re[19]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 10:37
"k732" <57436@users.rsdn.ru> wrote in message news:2545620@news.rsdn.ru...
> Здравствуйте, Sergey, Вы писали:
>
> S>А я-то думал, что ты стрим над сокетом собирался делать
>
> Так я так и не понял как читадь данные из потока, если неизвестна длигга данных.
> Пока делаю только с дополнительным заголовком фиксированного размера
>

Ну так одно другому не помеха. Просто заголовок можно передавать не 1 на всю сериализацию, а запихать его формирование в write и чтение — в read. Только это должен быть очень маленький заголовок — например, просто длина текущего пакета. Впрочем, если объем передаваемых данных невелик, можно с потоками над сокетами не заморачиваться и просто strstream'ом ограничится.
Posted via RSDN NNTP Server 2.1 beta
Re[20]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 10:40
Здравствуйте, Sergey, Вы писали:

S>Если заодно не забыть поменять и std::basic_ostream <unsigned char> ostream (&stream); на std::ostream ostream (&stream);то все замечательно скомпилируется. По крайней мере, на MSVC 8 sp1.


писал прям здесь, поэтому не то закоментировал.
Если unsigned char, то не дружит std::basic_ostream

но даже если просто char

            namespace bio = boost::iostreams;

            wdevice device (buffer);
            bio::stream_buffer<wdevice> stream (device);
            std::ostream ostream (&stream);

            boost::archive::binary_oarchive archive(ostream);
            archive << BOOST_SERIALIZATION_NVP (rhs);


то вот результат (компилятор тотже, но без sp1)


2>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
2>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
2>        with
2>        [
2>            T=parser::wdevice,
2>            Tr=std::char_traits<char>,
2>            Alloc=std::allocator<char>,
2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
2>        ]
2>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
2>        with
2>        [
2>            T=parser::wdevice,
2>            Tr=std::char_traits<char>,
2>            Alloc=std::allocator<char>,
2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
2>        ]
2>        xxx.h(171) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
2>        with
2>        [
2>            T=parser::wdevice
2>        ]
2>        .\dataspy.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
2>        with
2>        [
2>            T=Channels
2>        ]
2>C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2282) : warning C4996: 'std::_Copy_opt' was declared deprecated
2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2270) : see declaration of 'std::_Copy_opt'
2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
2>        e:\software\visual\atheros\wcl\stream.h(98) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_const_iterator<_Ty,_Alloc>,char*>(_InIt,_InIt,_OutIt)' being compiled
2>        with
2>        [
2>            _OutIt=char *,
2>            _Ty=char,
2>            _Alloc=std::allocator<char>,
2>            _InIt=std::_Vector_const_iterator<char,std::allocator<char>>
2>        ]

...
...
...

2>        xxx.h(176) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled
2>        with
2>        [
2>            Archive=boost::archive::binary_oarchive,
2>            T=const Channels
2>        ]
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2955: 'boost::type' : use of class template requires template argument list
2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2039: 'value' : is not a member of 'boost::type'
2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2065: 'value' : undeclared identifier
Re[21]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 11:22
>
> 2>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
> 2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
> 2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
> 2>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
> 2>        with
> 2>        [
> 2>            T=parser::wdevice,
> 2>            Tr=std::char_traits<char>,
> 2>            Alloc=std::allocator<char>,
> 2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
> 2>        ]
> 2>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
> 2>        with
> 2>        [
> 2>            T=parser::wdevice,
> 2>            Tr=std::char_traits<char>,
> 2>            Alloc=std::allocator<char>,
> 2>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
> 2>        ]
> 2>        xxx.h(171) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
> 2>        with
> 2>        [
> 2>            T=parser::wdevice
> 2>        ]
> 2>        .\dataspy.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
> 2>        with
> 2>        [
> 2>            T=Channels
> 2>        ]
> 2>C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2282) : warning C4996: 'std::_Copy_opt' was declared deprecated
> 2>        C:\Program Files\Microsoft Visual Studio 8\VC\include\xutility(2270) : see declaration of 'std::_Copy_opt'
> 2>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
> 2>        e:\software\visual\atheros\wcl\stream.h(98) : see reference to function template instantiation '_OutIt std::copy<std::_Vector_const_iterator<_Ty,_Alloc>,char*>(_InIt,_InIt,_OutIt)' being compiled
> 2>        with
> 2>        [
> 2>            _OutIt=char *,
> 2>            _Ty=char,
> 2>            _Alloc=std::allocator<char>,
> 2>            _InIt=std::_Vector_const_iterator<char,std::allocator<char>>
> 2>        ]
> 
> ...
> ...
> ...
> 
> 2>        xxx.h(176) : see reference to function template instantiation 'Archive &boost::archive::detail::interface_oarchive<Archive>::operator <<<const boost::serialization::nvp<T>>(const boost::serialization::nvp<T> &)' being compiled
> 2>        with
> 2>        [
> 2>            Archive=boost::archive::binary_oarchive,
> 2>            T=const Channels
> 2>        ]
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2955: 'boost::type' : use of class template requires template argument list
> 2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2039: 'value' : is not a member of 'boost::type'
> 2>        C:\boost\boost/type.hpp(14) : see declaration of 'boost::type'
> 2>C:\boost\boost/archive/detail/oserializer.hpp(132) : error C2065: 'value' : undeclared identifier
>

>

Это похоже что хедера какого-то не хватает. Причем не для стримов, а для сериализации. Можно попробовать скомпилировать то же просто со stringstream — думаю, будут те же ошибки.
Posted via RSDN NNTP Server 2.1 beta
Re[22]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 15:02
Здравствуйте, Sergey, Вы писали:

S>Это похоже что хедера какого-то не хватает. Причем не для стримов, а для сериализации. Можно попробовать скомпилировать то же просто со stringstream — думаю, будут те же ошибки.


Оказалось все проще. Нужно было поменять местами <iostream> и <fstream> при подключении. Правда не совсем понял почему.

Ну да ладно. Вроде сварилось с одним варнингом.
У меня все-таки есть вопрос
1. Можно ли это сделать для std::basic_ostream <unsigned char> ? Просто меня смущаем char. Боюсь будут проблеммы например с '\0' и т.п.
2. Я один раз отключал для сериалицации варнинг

# pragma warning (disable : 4267)


Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня



C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
        with
        [
            T=parser::wdevice
        ]
        (104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
        with
        [
            T=Channels
        ]
Re[23]: сериализация данных в избранное  новое    модер. 
От: Sergey 
Дата: 14.06.07 18:37
Здравствуйте, k732, Вы писали:

K>Ну да ладно. Вроде сварилось с одним варнингом.

K>У меня все-таки есть вопрос
K>1. Можно ли это сделать для std::basic_ostream <unsigned char> ?

Можно. Но, по всей видимости, придется инстанцировать архивы для типа unsigned char — при стандартной сборке буста они собираются только для char и wchar_t. Там есть кучка фалов с расширением ipp — придется включить их в проект и проинстацировать все шаблонные классы, на которые будет ругаться линкер. В общем, возни много, толку мало.

K>Просто меня смущаем char. Боюсь будут проблеммы например с '\0' и т.п.


С бинарной сериализаций никаких проблем из-за этого быть не должно. С текстовой сериализацией проблемы с нулями посреди строк будут в любом случае, независимо от того, char или unsigned char используется. А проблемы с бустовой сериализацией бывают совсем из-за другого...

K>2. Я один раз отключал для сериалицации варнинг


K>
K># pragma warning (disable : 4267)
K>


K>Но сейчас появился еще один. Критичен ли он ? И что он опять хочет от меня


K>
K>C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
K>        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
K>        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
K>        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
K>        with
K>        [
K>            T=parser::wdevice,
K>            Tr=std::char_traits<char>,
K>            Alloc=std::allocator<char>,
K>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
K>        ]
K>        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
K>        with
K>        [
K>            T=parser::wdevice,
K>            Tr=std::char_traits<char>,
K>            Alloc=std::allocator<char>,
K>            Mode=boost::iostreams::detail::io_mode_impl<2>::type
K>        ]
K>        parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
K>        with
K>        [
K>            T=parser::wdevice
K>        ]
K>        (104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
K>        with
K>        [
K>            T=Channels
K>        ]
K>


Ну это мокрософты решили что char_traits::move — функция небезопасная, ну и ругаются на эту тему. Можно просто определить макрос _SCL_SECURE_NO_WARNINGS — тогда это предупреждение (и подобные) должны пропасть.
Re[24]: сериализация данных в избранное  новое    модер. 
От: k732 
Дата: 14.06.07 18:41
Здравствуйте, Sergey, Вы писали:


S>Ну это мокрософты решили что char_traits::move — функция небезопасная, ну и ругаются на эту тему. Можно просто определить макрос _SCL_SECURE_NO_WARNINGS — тогда это предупреждение (и подобные) должны пропасть.


в самом деле помогло (но только часть ошибок)

        std::copy (
            m_container.begin() + m_index,
            m_container.begin() + m_index + result,
            stdext::checked_array_iterator<char_type *> (value, result)
        );


остались

C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(241) : warning C4996: 'std::char_traits<char>::move' was declared deprecated
        C:\Program Files\Microsoft Visual Studio 8\VC\include\iosfwd(470) : see declaration of 'std::char_traits<char>::move'
        Message: 'You have used a std:: construct that is not safe. See documentation on how to use the Safe Standard C++ Library'
        C:\boost\boost/iostreams/detail/streambuf/indirect_streambuf.hpp(230) : while compiling class template member function 'int boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>::underflow(void)'
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        C:\boost\boost/iostreams/stream_buffer.hpp(64) : see reference to class template instantiation 'boost::iostreams::detail::indirect_streambuf<T,Tr,Alloc,Mode>' being compiled
        with
        [
            T=parser::wdevice,
            Tr=std::char_traits<char>,
            Alloc=std::allocator<char>,
            Mode=boost::iostreams::detail::io_mode_impl<2>::type
        ]
        e:\wcl\parser.h(179) : see reference to class template instantiation 'boost::iostreams::stream_buffer<T>' being compiled
        with
        [
            T=parser::wdevice
        ]
        .\data.cpp(104) : see reference to function template instantiation 'void parser::serialize<Channels>(parser::sbuffer &,const T &)' being compiled
        with
        [
            T=Channels
        ]
1 2 3