Почему функция global2 терпит неудачу, хотя и global1, и global2 одинаковы, разница только в параметрах?

    #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» не было объявлено в этой области».

Интересный. Это вариант "самого досадного разбора"? en.wikipedia.org/wiki/Most_vexing_parse

Tim Roberts 25.08.2024 00:57

@TimRoberts Нет, это не «самый неприятный анализ», это Аргументозависимый поиск.

3CxEZiVlQ 25.08.2024 01:04

Отредактировал сообщение, извините за неудобства

shubham kakade 25.08.2024 01:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функции объявляются и определяются в области имени класса. Они не объявлены в области глобального имени, поэтому ожидается ошибка:

globalfunc2();  // error: use of undeclared identifier 'globalfunc2'

Когда ты звонишь

globalfunc1(obj);

Компилятор сначала ищет имя globalfunc1 в области имени аргумента obj и успешно находит globalfunc1 в области имени class A. Это правило Аргументозависимого поиска.

Спасибо за это... для меня это совершенно новая тема.

shubham kakade 25.08.2024 01:23

@shubhamkakade Это часть примерно 95 процентов C++, не используемая совместно с C, которую не преподают в школе.

user4581301 25.08.2024 01:39

Другие вопросы по теме