C ++ Friend функция вложенного класса в шаблоне класса - PullRequest
4 голосов
/ 08 ноября 2019

У меня следующая проблема. Приведенный ниже код прекрасно работает на GDB онлайн, однако локально компилируется так:

/ ... / g ++ -std = c ++ 17 -g -O3
/.../Test.cpp -o
/.../Test

выдает:

ошибка:
'privateMember' является приватным членом 'Foo<int>::Nested'

Я также пробовал с VS2019 - тот же эффект, что и у g ++ (который действительно является лязгом: Apple Clang версия 11.0.0 (clang-1100.0.33.8) ).

Что устраняет эту проблему: изменение вызова (комментарий "// 2")

make(...) -> make<int>(...)

или

удаление строкис комментарием "// 1".

Исправления независимы друг от друга - необходимо применить только одно .

template <typename T>
class Foo;

template <typename T>
typename Foo<T>::Nested make(T&& t);

template <typename T>
class Foo
{
public:
    class Nested
    {
        int privateMember{5};
        friend Nested make<T>(T&& e);
    };

    Nested k; //1
};

template <typename T>
typename Foo<T>::Nested make(T&& t)
{
    typename Foo<T>::Nested nested{}; 
    std::cout<<nested.privateMember<<std::endl;
    return nested;
}

int main() {
    auto i = make(1); //2
    return 0; }

Может кто-нибудь объяснить мне, что здесь происходит? Почему код работает нормально на gbd онлайн, а не на g ++, и почему помогают изменения (1, 2)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...