类模板中嵌套类的C ++ Friend函数

我遇到以下问题。以下代码可以在gdb在线上正常运行, 但是像这样本地编译:

  

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

产生:

  

错误:
  “ 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)会有所帮助?

lovetifa 回答:类模板中嵌套类的C ++ Friend函数

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3139291.html

大家都在问