我正在使用一些功能模板,以便按类型一般存储数据。
我定义了我的 template<class T> store()
函数,如下所示。
如果我使用类型uint64_t
store<uint64_t>( &p, my_value );
我收到编译时错误
call of overloaded 'store(char**, uint64_t&)' is ambiguous
candidates are:
void store(char**, T) [with T = long unsigned int]
void store(char**, T2) [with T1 = long unsigned int,
T2 = long unsigned int]
如果我不用类型写它而没有错误(编译器推断类型)。
store( &p, my_value );
我注意到编译器假定一个函数具有通过引用传递的第二个参数,而我的模板声明必须复制第二个参数。 你知道为什么会发生这种情况,怎么做才能解决这种歧义或者在类型声明中更明确?
最好的问候
AFG
template< class T >
inline void store( char** buffer, T data ){
memcpy( *buffer, &data, sizeof( T ) );
buffer += sizeof(T);
}
template< class T1, class T2 >
inline void store( char** buffer, T2 data ){
memcpy( *buffer, &data, sizeof( T1 ) );
buffer += sizeof(T1);
}
答案 0 :(得分:1)
不要使用过载功能。更改第二个程序的名称:
template< class T >
inline void store( char** buffer, T data ){
memcpy( *buffer, &data, sizeof( T ) );
buffer += sizeof(T);
}
template< class T1, class T2 >
inline void store_special( char** buffer, T2 data ){
memcpy( *buffer, &data, sizeof( T1 ) );
buffer += sizeof(T1);
}
使用样本
store_special<uint64_t>( &p, my_value );
答案 1 :(得分:0)
编译器不知道要采用哪个函数实现,因为它们都适合,并且错误消息中包含用于模板类的类型的详细信息。
看起来你可以删除一个方法,这个方法:
template< class T >
inline void store( char** buffer, T data ){
memcpy( *buffer, &data, sizeof( T ) );
buffer += sizeof(T);
}