#include<bits/stdc++.h>
using namespace std;
class A {
friend void globalfunc1(A & obj) {
cout << "Global func 1 called" << endl;
}
friend void globalfunc2() {
cout << "Global func 2 not called" << endl;
}
};
int main() {
A obj;
globalfunc1(obj); // this works
globalfunc2(); // this gives an error
return 0;
}
Я знаю, что если мы определим функцию внутри и объявим ее снаружи, она будет работать, но я хочу знать, почему существует несоответствие выше. Я получаю сообщение об ошибке: «globalfunc2» не было объявлено в этой области».
@TimRoberts Нет, это не «самый неприятный анализ», это Аргументозависимый поиск.
Отредактировал сообщение, извините за неудобства
Функции объявляются и определяются в области имени класса. Они не объявлены в области глобального имени, поэтому ожидается ошибка:
globalfunc2(); // error: use of undeclared identifier 'globalfunc2'
Когда ты звонишь
globalfunc1(obj);
Компилятор сначала ищет имя globalfunc1
в области имени аргумента obj
и успешно находит globalfunc1
в области имени class A
. Это правило Аргументозависимого поиска.
Спасибо за это... для меня это совершенно новая тема.
@shubhamkakade Это часть примерно 95 процентов C++, не используемая совместно с C, которую не преподают в школе.
Интересный. Это вариант "самого досадного разбора"? en.wikipedia.org/wiki/Most_vexing_parse