複数の可能性がある場合、C ++コンパイラはどの関数/メソッドを呼び出すかをどのように決定しますか?私の特定のケースでは、C ++ランタイムの標準の無料機能があり、次のようなテンプレート化された無料のバリアントもあります。
// The definitions of the C++ Run Time Library (from memory.h)
extern malloc(size_t s);
extern void free(void *p);
// Our own memory management functions
extern void *OurMalloc(size_t s);
extern void OurFree(void *p);
// Own variants to overrule malloc and free (instead of using #define)
template<typename T>
void *malloc(T t)
{
return OurMalloc(t);
}
template<typename T>
void free(T *t)
{
OurFree(t);
}
次のコードを使用してこれをテストしました。
void main(void)
{
void *p = malloc(10);
free(p);
}
これをコンパイルして実行すると、mallocの呼び出しがテンプレート化されたバリアントに正しく置き換えられているようです。ここまでは順調ですね。
ただし、freeの呼び出しはテンプレート化されたバリアントに置き換えられず、標準のC++関数が引き続き呼び出されます。
C ++コンパイラは、優先するバリアントを決定するためにどのようなルールを使用しますか?これはケーニッヒルックアップルールに関連していますか?
注:#defineを使用しても問題が解決しないため、この代替方法を試しました(Cマクロ(#define)を使用して呼び出しを変更する方法を参照してください。プロトタイプは変更しないでください)。