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) 有帮助?