уникальное ptr — C ++ фатальная ошибка C1001: в компиляторе произошла внутренняя ошибка

Я получаю следующую ошибку при компиляции в режиме релиза.

1>d:\users\eyal\projects\code\yalla\core\src\runbox\win32\window.cpp : fatal error C1001: An internal error has occurred in the compiler.
1>         (compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 249)
1>          To work around this problem, try simplifying or changing the program near the locations listed above.
1>         Please choose the Technical Support command on the Visual C++
1>          Help menu, or open the Technical Support help file for more information
1>           link!RaiseException()+0x48
1>           link!CxxThrowException()+0x65
1>           link!std::_Xout_of_range()+0x1f
1>           link!InvokeCompilerPass()+0x1b4e2
1>           link!InvokeCompilerPass()+0x22efe
1>           link!InvokeCompilerPass()+0x2332e
1>           link!InvokeCompilerPass()+0x232f9
1>           link!InvokeCompilerPass()+0x233cb
1>           link!InvokeCompilerPass()+0x22b04
1>           link!InvokeCompilerPass()+0x22d86
1>           link!DllGetC2Telemetry()+0x115837
1>
1>     1>
1>LINK : fatal error LNK1257: code generation failed

Я использую VS2015 Update 2 RC.

Я не уверен, но, возможно, это ошибка в оптимизаторе?

Код, который вызывает это, выглядит следующим образом:

window.h

class Window {
public:
Window();
~Window();
void show();
void hide();
private:
class NativeControl;
std::unique_ptr<NativeControl> _window;
};

window.cpp

class Window::NativeControl : public NativeWindow {
public:
NativeControl() : NativeWindow() { }
};

Window::Window()
: _window(std::make_unique<Window::NativeControl>()) {
}

Window::~Window() {
}

void Window::show()
{
_window->show(WindowShowMode::Show);
}

void Window::hide()
{
_window->show(WindowShowMode::Hide);
}

NativeWindow — это родное окно любой операционной системы.

Вот рабочий код, скомпилированный с GCC 5.1: https://ideone.com/4YvjRK

Просто чтобы сделать заметку.

Если я удалю наследство и заменим его чем-то вроде этого.

class Window::NativeControl {
public:
void show(WindowShowMode showMode)
{
}
};

Это будет работать нормально!

Вот тот же код, скомпилированный с GCC 5.1 без наследования: https://ideone.com/Mu0A42

То, что, кажется, вызывает это поведение, является производным NativeControl от NativeWindow.

Шаги, чтобы воспроизвести это следующим образом:

  1. Удалите объявление и определения dtor из класса Window.
  2. Попробуйте построить (не перестраивать).
  3. Компилятор пожалуется и выдаст вам кучу ошибок.

1> C: \ Program Files (x86) \ Microsoft Visual Studio
14.0 \ VC \ include \ memory (1194): ошибка C2338: невозможно удалить неполный тип 1> 1> 1> C: \ Program Files (x86) \ Microsoft Visual Studio
14.0 \ VC \ include \ memory (1195): предупреждение C4150: удаление указателя на неполный тип ‘Yalla :: Window :: NativeControl’; деструктор не называется
1>
d: \ Users \ Eyal \ Projects \ Code \ Ялла \ ядро ​​\ SRC \ runbox \ включить \ window.h (13):
примечание: см. объявление ‘Yalla :: Window :: NativeControl’ 1>
window.cpp 1> 1> Build Failed.

  1. Добавьте обратно dtor в класс Window.
  2. Построить снова (не перестраивать).
  3. На этом этапе компилятор должен пожаловаться на следующую ошибку «Неустранимая ошибка C1001: в компиляторе произошла внутренняя ошибка».

Интересная часть заключается в том, что восстановление, похоже, решает проблему!

То, чего я хочу добиться, — это, по сути, иметь фактическую реализацию NativeWindow в другом файле, в основном для простоты, а не для повторного использования.

Я думаю, что вместо того, чтобы делать это по наследству это может сбить с толку шаблон unique_ptr Я также могу сделать это с помощью композиции и выставить экземпляр NativeWindow через геттер, и он может быть работа, но вопрос в том, есть ли лучшие способы сделать это?

Я переучиваю C ++ после очень долгого времени, когда я его не трогал, поэтому, если некоторые из моих дел не имеют смысла, пожалуйста, расскажите мне об этом!

Обновить:

Стандарт C ++ гласит:

Параметр шаблона T для unique_ptr может быть неполного типа.

Я нашел пост об этом в Херб Саттерс блог.

5

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]