我遇到以下问题。以下代码可以在gdb在线上正常运行, 但是像这样本地编译:
/.../ g ++ -std = c ++ 17 -g -O3
/.../Test.cpp -o
/.../测试
产生:
我也尝试使用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)会有所帮助?