Поиск имени функции друга в локальном классе - PullRequest
2 голосов
/ 04 января 2012

Компиляция следующего:

void bar() { /* ... */ }

void foo()
{
    struct MyStruct
    {
        friend void bar();
    };
}

int main()
{
    //..
}

приводит к ошибке:

ошибка: объявление друга 'void bar ()' в локальном классе без предварительного объявления

Почему поиск имени не удался?Как я могу это исправить?

1 Ответ

2 голосов
/ 04 января 2012

Вы не можете получить доступ к локальному классу вне его границ, даже если вы дружите, потому что The name of a local class is local to its enclosing scope - §9.8 / 1.


Однако, если вы просто хотите получить его для компиляции, явно скажите ему, что он выглядит в глобальной области видимости ...

friend void ::bar();

* Это исправляет это в VS, но не в GCC по какой-то причине

§11.3 / 11 (спасибо, Джрок)

Если объявление друга появляется в локальном классе (9.8), а указанное имя является неквалифицированным именем, объявление ищется без учета областей, которые находятся за пределами самой внутренней охватывающей области, не относящейся к классу.

...