C++ 为visual studio重构不完整类型的模板

C++ 为visual studio重构不完整类型的模板,c++,visual-studio,templates,gcc,C++,Visual Studio,Templates,Gcc,我为一个赋值编写了一些代码,该赋值在gcc中按照预期进行编译和行为,但在VisualStudio中编译时抛出了C2027“未定义类型的使用”。以下是导致错误的行为: template<class Object> class Foo{ public: [....] private: [....] std::stack<Foo> bar;//error c2027 from instantiation with incomplete type }; 模板 福班{ 公

我为一个赋值编写了一些代码,该赋值在gcc中按照预期进行编译和行为,但在VisualStudio中编译时抛出了C2027“未定义类型的使用”。以下是导致错误的行为:

template<class Object>
class Foo{

public:
[....]

private: 
[....]

std::stack<Foo> bar;//error c2027 from instantiation with incomplete type
};
模板
福班{
公众:
[....]
私人:
[....]
std::stack bar;//类型不完整的实例化中出现错误c2027
};

我理解错误发生的原因,我一直努力想弄清楚的是如何在不大规模改变代码结构的情况下解决错误,或者如果可能的话。在这种特殊情况下,类使用自身的内部数据结构来存储它可以回滚到的先前状态的副本

添加一个间接级别:

struct FooData { /*...*/ };

struct Foo  {
    std::stack<FooData> bar;
}; 
structfoodata{/*…*/};
结构Foo{
std::堆栈条;
}; 

有关代码编译的原因,请参阅。总之:只有一些容器允许不完整的类型作为value_type(因为C++17),而其他容器则是未定义的行为(即不需要诊断)。感谢NathanOliver的链接

@user463035818哼。拒绝代码,所以我要说这是GCC扩展,而不是真正有效的C++标准代码。代码用GCC编译。您的示例具有错误的类名:看起来这可能是答案:。它是UB,只有某些容器可以使用不完整的类型作为模板参数。@NathanOliver我找不到任何不编译它的gcc版本(即使使用c++98),而clang似乎总是报告错误