2016-01-14 4 views
1

Первое сообщение здесь так жаль, если все не так. Я слежу за учебником по C++ & directx11, и я придумал ошибку, которая не реплицируется в учебнике. Образец кода находится в заголовке, который я создал. В разделе «private:» все три строки кода дают ошибку «IntelliSense: инициализатор элемента данных не разрешен».Нужна помощь: «IntelliSense: инициализатор элементов данных не разрешен»

#pragma once 
#include "Window.h" 
#include <d3d11.h> 

class Renderer 
{ 
public: 
    Renderer(Window& window); 

private: 
    //Errors here 
    IDXGISwapChain* m_SwapChain = nullptr; 
    ID3D11Device* m_device = nullptr; 
    ID3D11DeviceContext* m_deviceContext = nullptr; 
} 
+2

Иногда intellisense ошибочен. Скомпилирует ли он? – NathanOliver

+0

Если я правильно помню, инициализация по умолчанию таким образом разрешена только с C++ 11. Можете ли вы показать нам, как вы скомпилируете свой код? –

+0

Это, похоже, дубликат [инициализатор элементов данных C++ не разрешен] (http://stackoverflow.com/questions/10936009/c-data-member-initializer-is-not-allowed) –

ответ

1

Вы не можете инициализировать элементы данных в определении класса. Правильный способ сделать это в файле CPP:

IDXGISwapChain* Renderer::m_SwapChain = nullptr; 
ID3D11Device* Renderer::m_device = nullptr; 
ID3D11DeviceContext* Renderer::m_deviceContext = nullptr; 

Вы также можете сделать это в конструкторе, например, так:

Renderer::Renderer(Window& window) : 
    m_SwapChain(nullptr), 
    m_device(nullptr), 
    m_deviceContext(nullptr) 
{ 
    // Initialization code here 
} 

Я предпочитаю последний.

+1

На самом деле вы можете в C++ 11 и выше: http://coliru.stacked-crooked.com/a/19087ed32a3c0bdd – NathanOliver

+0

Но, очевидно, не в компиляторе, который использует OP. –

+3

Возможно, может и нет. Иногда intellisense выдает ошибку, но код все еще компилируется. Поскольку этот пост просто помечен C++, мы должны ответить в отношении текущего стандарта во время запроса. – NathanOliver