类模板中嵌套类的 C++ 友元函数

Mic*_* P. 6 c++ templates inner-classes friend-function

我遇到以下问题。下面的代码在 gdb 在线上运行良好,但是在本地编译如下:

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

产生:

错误: “privateMember”是“ ”
的私有成员Foo<int>::Nested

我还尝试了 VS2019 - 与 g++ 相同的效果(这实际上是一个 clang: Apple clang version 11.0.0 (clang-1100.0.33.8))。

解决此问题的方法是:更改调用(注释“//2”)

make(...) -> make<int>(...)
Run Code Online (Sandbox Code Playgroud)

或者

删除带有注释“//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; }
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下这里发生了什么吗?为什么代码在 gbd 在线上运行良好,而不是在 g++ 上运行良好,为什么更改 (1, 2) 有帮助?