【问题标题】:Refactoring out template of incomplete type for visual studio为visual studio重构出不完整类型的模板
【发布时间】:2019-03-23 14:46:22
【问题描述】:

我为在 gcc 中编译和运行的赋值编写了一些代码,但在 Visual Studio 中编译时抛出了 C2027 'use of undefined type'。以下是导致错误的行为:

template<class Object>
class Foo{

public:
[....]

private: 
[....]

std::stack<Foo> bar;//error c2027 from instantiation with incomplete type
};

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

【问题讨论】:

  • @user463035818 哼。 Clang 拒绝代码,所以我要说这是一个 gcc 扩展,实际上不是有效的标准 C++ 代码。

标签: c++ visual-studio templates gcc


【解决方案1】:

添加一个间接级别:

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

struct Foo  {
    std::stack<FooData> bar;
}; 

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2014-11-22
  • 2014-05-11
  • 1970-01-01
相关资源
最近更新 更多