Я пишу свою собственную библиотеку для удовольствия, и я столкнулся с проблемой. Вот мой код
#include "utility/memory.h"using namespace libnate::utility;
template <class T>
void copy( T *src, T *dest, size_t size ) {
for( size_t i = 0; i < size; ++i ) {
dest[i] = src[i];
}
}
template void copy( int *, int *, size_t );
template <class T>
size_t resize_array( T *&array, size_t internal_size ) {
size_t nu_size = internal_size * 2 + 1;
T *tmp_array = new T[nu_size];
copy<T> ( array, tmp_array, internal_size );
delete [] array;
array = tmp_array;
return nu_size;
}
template size_t resize_array( int *&, size_t );
G ++ жалуется на какой-то неоднозначный вызов в моем призыве к копированию.
Вот выход.
njackson@glados:~/libnate$ make
cd src && make
make[1]: Entering directory `/home/njackson/libnate/src'
g++ -c -I../include memory.cpp
memory.cpp: In function ‘size_t resize_array(T*&, size_t) [with T = int, size_t = unsigned int]’:
memory.cpp:25:46: instantiated from here
memory.cpp:18:2: error: call of overloaded ‘copy(int*&, int*&, size_t&)’ is ambiguous
memory.cpp:18:2: note: candidates are:
memory.cpp:5:6: note: void copy(T*, T*, size_t) [with T = int, size_t = unsigned int]
../include/utility/memory.h:11:6: note: void libnate::utility::copy(T*, T*, size_t) [with T = int, size_t = unsigned int]
make[1]: *** [memory.o] Error 1
make[1]: Leaving directory `/home/njackson/libnate/src'
make: *** [_] Error 2
Любая помощь приветствуется. Благодарю.
Из сообщения об ошибке кажется довольно ясным, что пространство имен libnate::utility
включает в себя функцию с именем copy
, Так как вы определяете свой собственный, и есть using namespace libnate::utility
В начале вашего кода вы получите конфликт имен.
Я рекомендую удалить using namespace
заявление. Его сохранение может привести к тому, что в ваш код будет добавлено много других символов, что может привести к дальнейшим конфликтам имен в будущем.
Если вы действительно хотите сохранить утверждение, либо используйте ::copy
ссылаться на собственную версию функции копирования или просто переименовать ее в mycopy
или что-то типа того.
На отдельном примечании, ваше явное создание copy
функция (которая в любом случае не вызывает проблем) на самом деле не нужна. resize_array
использует ваш copy
функция и, следовательно, будет вызывать необходимые экземпляры автоматически.
Других решений пока нет …