我需要解析一个自定义协议的框架,这些框架可以包含各种大小的整数(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
我不是模板专家。这是我第一次尝试进行模板专业化,所以我的语法可能不对。
你会帮帮我吗?谢谢:))答案 0 :(得分:8)
专业化如下:
template <typename T>
void foo(A x, B y, C z); // primary template
template <>
void foo<std::string> foo(A x, B y, C z); // specialized for T = std::string
答案 1 :(得分:4)
专业化应该是:
template<>
std::string read< std::string >( blah blah blah)
答案 2 :(得分:3)
显式专业化如下所示:
template <>
std::string read<std::string>( const std::vector< byte > & bytes, uint index )
{
// ...
}
此处第一个<>
是模板参数集。没有,因为您指定的是精确的函数类型,而不是另一个模板。第二个<>
是模板参数,指定要定义的模板特化。
请注意,显式特化的定义属于源文件,而不是头文件。除非您添加inline
。
答案 3 :(得分:2)
更改自:
template< std::string >
std::string read( const std::vector< byte > & bytes, uint index )
到此:
template<>
std::string read< std::string >( const std::vector< byte > & bytes, uint index )