ошибка из-за неоднозначности в объявлении функции шаблона - PullRequest
2 голосов
/ 20 июня 2011

Я использую некоторые шаблоны функций для хранения данных в целом и по типам.

Я определил свои 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 ]

1 голос
/ 20 июня 2011

Не используйте функции перегрузки.Измените имя второй процедуры:

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 );   
0 голосов
/ 20 июня 2011

Компилятор не знает, какую реализацию функции взять, так как они оба подходят, и детали того, какие типы используются для классов шаблонов, содержатся в сообщении об ошибке.вот этот:

template< class T >
inline void store( char** buffer, T data ){

    memcpy( *buffer, &data, sizeof( T ) );
    buffer += sizeof(T);
}
...