Здравствуйте!
Может кто ткнет носом?
template< class TNumberHandler, typename T >
class CStreamNumberTypeImpl
{
protected:
bool m_bNeedSwap;
T* m_pValue;
T m_Value;
public:
CStreamNumberTypeImpl()
:m_bNeedSwap(true), m_pValue(NULL)
{
};
void ToStream(std::ostream& s)
{
m_Value = *m_pValue;
if(m_bNeedSwap)
{
TNumberHandler* pNumberHandler = static_cast< TNumberHandler* >(this);
if(pNumberHandler) pNumberHandler->hton();
}
s.write(reinterpret_cast< char* >(&m_Value), sizeof(T));
};
void FromStream(std::istream& s)
{
s.read(reinterpret_cast< char* >(&m_Value), sizeof(T));
if(m_bNeedSwap)
{
TNumberHandler* pNumberHandler = static_cast< TNumberHandler* >(this);
if(pNumberHandler) pNumberHandler->ntoh();
}
*m_pValue = m_Value;
};
friend std::istream& operator >> (std::istream& s, CStreamNumberTypeImpl< TNumberHandler, T >& clLongTypeStream)
{
clLongTypeStream.FromStream(s);
return s;
};
friend std::ostream& operator << (std::ostream& s, CStreamNumberTypeImpl< TNumberHandler, T >& clLongTypeStream)
{
clLongTypeStream.ToStream(s);
return s;
};
};
class CStreamSizeT :
public CStreamNumberTypeImpl<CStreamSizeT, std::size_t>
{
public:
CStreamSizeT(std::size_t* pValue, bool bNeedSwap = true)
{
m_pValue = pValue;
m_bNeedSwap = bNeedSwap;
};
CStreamSizeT(const std::size_t* pValue, bool bNeedSwap = true)
{
m_pValue = const_cast< std::size_t* >(pValue);
m_bNeedSwap = bNeedSwap;
};
void ntoh() { m_Value = static_cast< std::size_t >(ntohl(m_Value)); };
void hton() { m_Value = static_cast< std::size_t >(htonl(m_Value)); };
};
//в коде
std::stringstream s;
std::size_t size(0);
....
s >> CStreamSizeT( &size, true ); //-->тут дает ошибку при компиляции под gcc в msvc все ок