c++ - 由于模板函数声明中的歧义而出错

标签 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);
}

最佳答案

不要使用重载函数。更改第二个过程的名称:

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 );   

关于c++ - 由于模板函数声明中的歧义而出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6408597/

相关文章:

c++ - "Function template has already been defined"与互斥的 `enable_if` s

c++ - 使用数组和 rand 来计算 1-10 之间整数的实例数?

c++ - 错误:在 '['之前应有预期的unqualified-id,并且在此范围内未声明ERROR: 'users'

c++ - 如何将函数传递给模板函数 A,该函数可能具有基于 A 的另一个参数的不同签名?

g++ - Freepascal是否真的比gcc使用*少*的内存

c++ - g++ 生成依赖文件缺少用户定义的 header

c++ - 是否有更多结构/类以获得更好的命名约定?

C++ 模板方法未知返回类型

c++ - 具有const ref参数的函数模板特化

c++ - 从返回值 : how does it work? 创建 const 左值引用