Предположим, я объявил (в c ++, VS 2010), в одном из заголовочных файлов функцию с именем «void f (int x)«, затем реализовал его в соответствующем файле cpp.
При попытке добавить функцию перегрузки (void f (int x, int y) ) только в этом исходном файле (в заголовке нет объявления), я получаю сообщение об ошибке «функция не принимает 2 аргумента».
(Эта функция написана над вызывающей функцией).
Файл заголовка не имеет реализованного кода.
Я нарушил некоторые правила c ++, или это только из-за использования Visual?
Должен ли я объявлять все функции перегрузки в заголовочном файле (или вообще ничего)?
Редактировать:
Исходный файл:
int findNodeRec(int data, NodeTree *root)
{
return 1;
}
int Tree::findNodeRec(int data)
{
return findNodeRec(data, m_root);
}
Проблема состоит в том, что версия с одним параметром определяется как член класса, а версия с двумя параметрами является свободной функцией. Когда компилятор пытается найти кандидатов для вызова, он не будет смешивать разные области видимости, поэтому он только видит версию области класса, а затем пытается выбрать лучшую перегрузку на основе параметров.
Просто позвони ::f(x, y)
вместо этого он будет искать в глобальной области действия свободную функцию. Обратите внимание, что не имеет значения, была ли объявлена свободная функция в заголовке или нет. Компилятор так и не смог его найти.
Других решений пока нет …