C ++ / CX标头文件找不到Microsoft名称空间

Cap*_*ard 0 directx-11 c++-cx visual-studio-2013

我有一个带有以下代码的头文件:

  Microsoft::WRL:ComPtr<ID3D11Device2> m_device;
Run Code Online (Sandbox Code Playgroud)

在类定义中。Visual Studio 2013表示Microsoft不是名称空间,如果我将代码剪切并切下,然后将其放在另一个文件的另一个类中,则保持不变就可以了!

有任何想法吗?

菲利浦

编辑:突然之间(无需我进行任何更改)Intelissense现在接受Microsoft :: WRL :: ComPtry为有效,但是在我编译时它仍然给我错误,提示它不存在。

Chu*_*urn 5

你需要

#include <wrl.h>
Run Code Online (Sandbox Code Playgroud)

要么

#include <wrl/client.h>
Run Code Online (Sandbox Code Playgroud)

进入Microsoft::WRL::ComPtr您的模块。

当您说“ Visual Studio 2013表示Microsoft不是名称空间”时,您是说遇到编译器错误还是仅仅是Intellisense?处理标头时,Intellisense可能会有些不同步,直到再次构建。例如:

//Test.h
class A { Microsoft::WRL::ComPtr<T> a; };

//Test.cpp
#include <wrl/client.h>
#include "Test.h"
Run Code Online (Sandbox Code Playgroud)

如果您只是将它添加#include <wrl/client.h>到Test.cpp中,则Intellisense可能还不知道它在标头的范围内。它已经完全是C ++了,但是更好的做法是在标头中包含所需的标头,例如:

//Test.h
#pragma once
#include <wrl/client.h>
class A { Microsoft::WRL::ComPtr<T> a; };
Run Code Online (Sandbox Code Playgroud)

此同步问题可以显示的另一种方式是:

//Test.h
class A { Microsoft::WRL::ComPtr<T> a; };

//Test.cpp
#include "pch.h"
#include "Test.h"

//pch.h
#include <wrl/client.h>
Run Code Online (Sandbox Code Playgroud)

同样,将构建完全有效的C ++。Intellisense知道在您构建时它会起作用,但直到那时才可能起作用。

注意:WRL是传统的C ++,并且未使用C ++ / CX语言扩展。它们都存在,以便更轻松地从C ++使用WinRT API,并且Microsoft::WRL::ComPtr在处理非WinRT COM API(如Direct3D)时,您会在C ++ / CX应用程序中看到它们的用法。而且,您可以利用reinterpret_cast<>C ++ / CX ref ^和ABI COM指针之间使用的事实,将C ++ / CX与WRL混合在同一应用程序中。您也可以Microsoft::WRL::ComPtr在Windows 7或Windows Vista的老式Windows桌面应用程序中使用。

综上所述,WRL和C ++ / CX是两件截然不同的事情。

更新:为了使用Windows运行时API,您还可以使用C ++ / WinRT,它也是“标准” C ++,而无需C ++ / CX扩展。请参阅Microsoft Docs。您可以将其Microsoft::WRL::ComPtr用于C ++ / WinRT应用程序,也可以使用其变体wrl::com_ptr