У меня следующая проблема. Приведенный ниже код прекрасно работает на 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)?