【问题标题】:Switching from MSVC14 to MSVC16 leads to "compiler is out of heap space (C1060)" error从 MSVC14 切换到 MSVC16 导致“编译器堆空间不足 (C1060)”错误
【发布时间】:2019-11-08 10:08:07
【问题描述】:

我正在尝试从Visual Studio 14 2015 编译器切换到Visual Studio 16 2019 来编译我的项目(也尝试过Visual Studio 15 2017,但这导致了同样的问题)。我正在使用irrequietus/typestring,它在旧编译器上运行良好,但现在会导致错误。

这是一个应该与类型字符串一起使用的类:

// my_custom_class.h
template<typename T>
class MyCustomClass
{
public:
  static bool compareTheTypestring(const std::string& other) const {
    return std::strcmp(data(), other.c_str()) == 0;
  }
}

这就是我使用课程的方式:

// use_it.cpp
#include "typestring.hh"
#include "my_custom_class.h"
typedef MyCustomClass<typestring_is("Foo")> FooCompare;

typestring.hh 中吐出以下错误:

  • compiler is out of heap space (C1060)

use_it.cpp 中还有更多错误:

  • irqus::typeek: no matching overloaded function found (C2672)
  • Failed to specialize function template 'unknown-type irqus::typeek(irqus::typestring&lt;C...&gt;)'
  • 无法推断MyCustomClass 的模板参数

存储库包含类似的问题,但维护者似乎没有回复。我试图找到替代的类型字符串实现,但找不到。谁能帮我解决这个问题,好吗?

【问题讨论】:

  • 对于初学者来说,静态成员函数可能没有限定符 const。
  • 啊我明白了...您想使用字符串作为模板参数。您/确定/那是您问题的最佳解决方案吗?我的意思是,有数以百万计的 C++ 程序员,而且这不是库的一部分或者有一个很好的最新的第三方库的事实必须表明一些东西......也许解释/为什么/你需要它。

标签: c++ templates metaprogramming


【解决方案1】:

这个issue has already been reported in january,从那时起有 0 条回复。该库似乎不再更新...也许寻找替代解决方案

您确实应该将您正在尝试做的事情的详细信息添加到您的问题中。在我了解您要实现的目标之前,必须通读外部库。我最好的建议是:寻找替代方案。编译时字符串还有其他方法。模板参数可能不是最好的答案。

如果你真的想要使用模板参数字符串,你必须自己修复它。该库可能依赖于未定义的行为。所以现在坏了。 我正在尝试它,但它不是很直接。您可能需要在宏中使用charizing operator 来拆分字符串,然后将字符放入元组类型...

template<char c>
class CharType {
public:
    static constexpr char Char = c;
};

using FooString = std::tuple<CharType<'F'>, CharType<'o'>, CharType<'o'>>;

或者类似的东西。

【讨论】:

  • 感谢您的回答。我会看看 charizing 运算符,也许这就是我要找的。否则,您可能是对的:也许有更好的选择来做我想做的事情。
猜你喜欢
  • 2014-07-17
  • 2017-03-10
  • 2011-06-04
  • 2018-12-21
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多