2016-07-09 12 views
1

Here (см. Описание точки 2) Я прочитал, что определение функции друга в классе допускается только в нелокальным определением класса.Функция определения функции Friend в классе допускается только в определениях нелокального класса. Что это значит?

Что это значит?

+1

Ваш вопрос непонятен и искажен. Ссылки не заменяют содержание. – Amit

+0

Я думаю, что очень точный и автономный, ссылка не нужна для понимания вопроса. На самом деле, я получил ответ, который был у меня менее чем за 1 минуту. –

+0

Ответы, которые вы получили, объясняют, что такое местный класс - это не то, о чем спрашивает ваш вопрос. Приятно, что у вас есть ответ, который вам нужен, но вопрос все еще искажен. – Amit

ответ

2

Нелокальный класс - это класс, который не является локальным.

Локальный класс является классом, определенным в функции - см параграфа «Локальные классы» on this page

«функция Друга в классе определение» относится к способности объявить и определить функцию, не являющийся членом внутри класса, который является другим классом он заключен в.

class a_class 
{ 
    friend std::ostream& operator<<(std::ostream& os, const a_class& x) 
    { 
     // ... 
    } 
}; 
+0

Получил 3 почти эквивалентных ответа. Я просто принимаю первый. –

1

определения нелокального класса является определением, которое не определенно в другом теле класса или он не встроен в теле функции.

Так в основном вы можете сделать это:

#include <iostream> 

struct NonLocal 
{ 
    friend std::ostream& operator<<(std::ostream& os, const NonLocal& l) 
    { 
    os << l.x; 
    return os; 
    } 

private: 
    int x; 
}; 

int main() 
{ 
    NonLocal nl; 
    std::cout << nl; 
} 

, но вы не можете сделать это:

#include <iostream> 

int main() 
{ 
    struct Local 
    { 
    friend std::ostream& operator<<(std::ostream& os, const Local& l) // this will fail to compile 
    { 
     os << l.x; 
     return os; 
    } 

    private: 
    int x; 
    }; 

    Local l; 
    std::cout << l; 
} 

От cppreference.com:

Класс декларации может появиться в области видимости пространства имен (в этом случае он определяет обычный класс), внутри другого определения класса (в котором , он определяет вложенный класс) и внутри тела функции, в , в каком случае он определяет локальный класс . Имя такого класса только существует в пределах области действия и не доступно снаружи.

  • Локальный класс не может иметь статические члены
  • функции члены локального класса не имеют никакой связи
  • функции-члены локального класса должны быть определены полностью внутри тела класса
  • Локальные классы, кроме (поскольку C++ 14) не может иметь шаблонов членов
  • Локальные классы не могут иметь шаблоны друзей
  • Локальный класс внутри функции (включая функцию-член) может обращаться к тем же именам, что и Доступ к закрывающей функции.
  • локальные классы не могут быть использованы в качестве аргументов шаблона (до C++ 11)

[курсив мой]

0

Это означает, что вы не можете сделать это:

void function() 
{ 
    class X 
    { 
     int a; 
     friend void friend_set(X& p, int i) 
     { 
      p.a = i; 
     } 
     public: 
     void member_set(int i) 
     { 
      a = i; 
     } 
    }; 
} 

Локальные классы - это те, которые определены внутри функции.

 Смежные вопросы

  • Нет связанных вопросов^_^