2010-09-03 2 views
6

$ 11,4/5 - «[...] Функция друга определен в классе в (лексической) области видимости класса, в котором он определен [...]»Друзей спутанность

Что делает это утверждение означает?

struct A{ 
    typedef int MYINT; 
    void f2(){f();}     // Error, 'f' is undefined 
    friend void f(){MYINT mi = 0;}  // Why does this work, shouldn' it be A::MYINT? 
    void f1(){f();}     // Error, 'f' is undefined 
}; 

int main(){} 
  1. Смущает здесь является то, что призыв к 'F' от 'A :: f1' тихо и понятно. Однако почему звонок «f» из «A :: f2» плохо сформирован, когда друг находится в «лексическом» диапазоне подружительного класса? Что означает «лексическая» область?

  2. В этом же типе почему использование 'MYINT' в 'f' ОК? Разве это не должно быть «A :: MYINT»?

Если добавить параметр типа «А '» до «F», то как «f1» и «F2» могут найти «F» из-за ADL. Это понятно.

+2

находится в (лексическом) объеме, что означает, что он имеет доступ к содержанию области. поэтому MYINT действителен. http://stackoverflow.com/questions/1047454/what-is-lexical-scope, http://stackoverflow.com/questions/991518/c-how-do-i-call-a-friend-template-function- установленные внутри-а класс – Anycorn

ответ

1

Вы указали только часть § 11.4/5. В соответствии с этим f() должен быть объявлен вне класса первым (функция должна иметь область пространства имен). Попробуйте это:

void f(); // declare it first 
struct A{ 
    typedef int MYINT; 
    void f2(){f();}      
    friend void f(){MYINT mi = 0;}  // definition of global f, a friend of A 
    void f1(){f();}      
}; 

Что касается второго вопроса, то это нормально, потому цитируемый вами части § 11,4/5. f() подчиняется тем же правилам связывания имен как статическая функция-член этого класса и не имеет специальных прав доступа к членам охватывающего класса.

0

Вот мой interpreation из одной части моего запроса, который

«Почему Минт» может упоминаться как «Минт» вместо «A :: Минт»?

$ 3.4.1/9 состояние - «Имя поиск для имени, используемого в определении друга функции (11.4) определяется рядный в классе ПРЕДОСТАВЛЕНИИ дружбы должны действовать, как описано для поиска в определений функций-членов . Если функция друг не определена в предоставлении дружбы класса, поиск имени в определении друга функции поступит, как описаны для поиска в функции члена пространства имен определений «.

В нашем случае имя, подлежащее поиску, является «MYINT», которое является неквалифицированным именем. Поиск этого имени внутри определения друга 'f', который был определен inline в классе, будет выполнен в том же порядке, что и для функций-членов 'A'.

Правильно ли я понимаю?

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