0

私はそれを楽しむために自分のライブラリを書いていますが、問題が発生しました。これが私のコードです。

#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

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

0

libnate::utilityエラー メッセージから、名前空間に という名前の関数が含まれていることは明らかですcopy。独自に定義していて、using namespace libnate::utilityコードの先頭にステートメントがあるため、名前の競合が発生します。

using namespaceステートメントを削除することをお勧めします。それを保持すると、コードに他の多くのシンボルが導入される可能性があり、将来さらに名前の衝突が発生する可能性があります。

本当にステートメントを保持したい場合::copyは、コピー機能の独自のバージョンを参照するために使用するか、単に名前を変更するmycopyか、そのようなものにします。


別の注意として、copy関数の明示的なインスタンス化(とにかく問題を引き起こさない)は実際には必要ありません。resize_array関数を使用するcopyため、必要なインスタンス化が自動的に行われます。

于 2012-10-12T03:42:23.007 に答える