Мне нужно проанализировать кадры пользовательского протокола, которые могут содержать целые числа различных размеров (uint8_t, uint16_t, uint32_t и т. д.) и строки символов с префиксом их длины (uint16_t).
Я хочу написать шаблонную функцию для чтения таких значений из вектора байтов, чтобы сделать синтаксис более читабельным. Вот мои функции:
template< typename type >
type read( const std::vector< byte > & bytes, uint index )
{
if( index + sizeof( type ) > bytes.size() )
{
throw exception( "read() - Out of range." );
}
type val;
memcpy( & val, & bytes[ index ], sizeof( type ) );
return val;
}
template< std::string >
std::string read( const std::vector< byte > & bytes, uint index ) // ERROR HERE
{
if( index + sizeof( type ) > bytes.size() )
{
throw exception( "read() - Out of range." );
}
uint16_t length = read< uint16_t >( bytes, 0 );
std::string str( length, '\0' );
for( uint16_t i = 0; i < length; ++i )
{
str[i] = read< char >( bytes, index + i );
}
return str;
}
Я получаю эту ошибку на VS2005:
Error 1 error C2993: 'std::string' : illegal type for non-type template parameter '__formal' c:\dev\floatinglicences\common\common.h 50
Я не специалист по шаблонам. Это первый раз, когда мне нужно попытаться сделать специализацию шаблона, поэтому мой синтаксис может быть неправильным.
Ты мне поможешь ? Спасибо :)