Как компилятор 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) для изменения вызовов, но не прототипов ).