C ++函数的显式实例化

时间:2012-10-12 03:30:15

标签: c++ function instantiation explicit

我正在编写自己的图书馆以获得它的乐趣,我遇到了一个问题。这是我的代码。

#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

感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

从错误消息中可以清楚地看出,命名空间libnate::utility包含一个名为copy的函数。由于您定义了自己的代码,并且在代码的开头有using namespace libnate::utility语句,因此会出现名称冲突。

我建议删除using namespace语句。保留它可能会导致很多其他符号被引入到您的代码中,可能导致将来进一步的名称冲突。

如果您真的想保留该声明,请使用::copy引用您自己的复制功能版本,或者只将其重命名为mycopy或类似名称。


另外,在copy函数的显式实例化(不会导致问题)实际上并不是必需的。 resize_array使用您的copy函数,因此会自动生成所需的实例化。