Переключение с MSVC14 на MSVC16 приводит к ошибке «Компилятору не хватает места в куче (C1060)» - PullRequest
1 голос
/ 08 ноября 2019

Я пытаюсь переключиться с компилятора 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<C...>)'
  • не может вывести аргументы шаблона для MyCustomClass

В хранилище есть похожая проблема, но сопровождающий, похоже, не отвечает. Я пытался найти альтернативные реализации типизирования, но не смог. Может кто-нибудь помочь мне решить эту проблему, пожалуйста?

1 Ответ

1 голос
/ 08 ноября 2019

Об этой проблеме уже сообщалось в январе , с тех пор было получено 0 ответов. Кажется, библиотека больше не обновляется ... может быть, вы ищете альтернативное решение

Вы должны действительно добавить детали того, что вы пытаетесь сделать, в свой вопрос. Должен прочитать внешнюю библиотеку, прежде чем я понял, что вы пытаетесь достичь. Мое лучшее предложение будет: искать альтернативу. Существуют и другие способы для строк времени компиляции. Аргументы шаблона, вероятно, не лучший ответ.

Если вы действительно хотите использовать строки аргументов шаблона, вам придется исправить это самостоятельно. Библиотека, вероятно, полагается на неопределенное поведение. Так что сейчас сломано. Я пробовал это, но это не очень прямо вперед. Вам, вероятно, понадобится использовать оператор вычисления в макросах, чтобы разбить строку, а затем поместить символы в тип кортежа ...

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

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

или что-то в этом роде.

...