Почему пространство имен не требуется в «дружественном классе» для базового класса?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему пространство имен не требуется в «дружественном классе» для базового класса?

Сообщение Anonymous »

У меня есть эта демо-версия. Я не понимаю, почему мне не нужно указывать имя пространства имен tn для дружественного класса InnerClass для базового класса. Отмечено в приведенном ниже коде.
Я бы предпочел использовать дружественный класс tn::InnerClass, просто чтобы было понятно. Особенно, если есть еще один InnerClass.

Код: Выделить всё

class MainClass;
class InnerClass;

namespace tn
{
template
class InnerClass
{
public:
auto empty() -> int { return static_cast(this)->privateMember; }
};
}

namespace foo
{
class OtherClass : public tn::InnerClass
{
friend class ::MainClass;
friend class InnerClass;    // tn:: must NOT be used.
friend class ::InnerClass;  // Otherwise InnerClass::empty() fails to compile

int privateMember {};
};
}

class InnerClass
{
auto empty(foo::OtherClass & otherClass ) -> int { return otherClass.privateMember; }
};

class MainClass
{
auto bar()
{
foo::OtherClass otherClass;
otherClass.empty();
}
};

int main()
{
}
Почему НЕ следует указывать имя шаблона (в данном случае tn::)? На мой взгляд, это своего рода неявное использование производного шаблона для дружественного класса.

Подробнее здесь: https://stackoverflow.com/questions/798 ... base-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»