C ++: перегрузка двумя функциями, одна в заголовочном файле, другая нет

Предположим, я объявил (в 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);
}

2

Решение

Проблема состоит в том, что версия с одним параметром определяется как член класса, а версия с двумя параметрами является свободной функцией. Когда компилятор пытается найти кандидатов для вызова, он не будет смешивать разные области видимости, поэтому он только видит версию области класса, а затем пытается выбрать лучшую перегрузку на основе параметров.

Просто позвони ::f(x, y) вместо этого он будет искать в глобальной области действия свободную функцию. Обратите внимание, что не имеет значения, была ли объявлена ​​свободная функция в заголовке или нет. Компилятор так и не смог его найти.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]