由于模板函数声明中的歧义而导致错误

时间:2011-06-20 08:32:16

标签: c++ templates g++

我正在使用一些功能模板,以便按类型一般存储数据。

我定义了我的 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);
}

2 个答案:

答案 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);
}