C ++ / CX头文件无法找到Microsoft命名空间

时间:2015-06-26 21:41:20

标签: visual-studio-2013 directx-11 c++-cx

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

  Microsoft::WRL:ComPtr<ID3D11Device2> m_device;

在类定义中。 Visual Studio 2013说微软不是一个命名空间,如果我把代码删掉并将它放在另一个文件中的另一个类中,它就可以正常工作了!

有什么想法吗?

菲利普

编辑:突然间(没有我改变任何东西)Intelissense现在接受Microsoft :: WRL :: ComPtry作为有效但是当我编译它仍然给我错误,它不存在。

1 个答案:

答案 0 :(得分:5)

你需要

#include <wrl.h>

#include <wrl/client.h>

在模块中获取Microsoft::WRL::ComPtr

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

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

//Test.cpp
#include <wrl/client.h>
#include "Test.h"

如果你刚刚将#include <wrl/client.h>添加到Test.cpp,Intellisense可能还不知道它是否在标题范围内。它已经是完全有效的C ++,但更好的做法是在标题中包含它需要的那些:

//Test.h
#pragma once
#include <wrl/client.h>
class A { Microsoft::WRL::ComPtr<T> a; };

此同步问题可能表现出来的另一种方式是:如果您正在执行:

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

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

//pch.h
#include <wrl/client.h>

同样,将构建完全有效的C ++。 Intellisense知道它在你构建时有效,但在那之前可能不会。

注意:WRL是传统的C ++,并没有使用C ++ / CX语言扩展。它们都存在,以便更容易使用C ++中的WinRT API,您将看到Microsoft::WRL::ComPtr在处理非WinRT COM API(如Direct3D)时,在C ++ / CX应用程序中使用。您可以在同一个应用程序中混合使用C ++ / CX和WRL,这样可以在C ++ / CX ref ^和ABI COM指针之间使用reinterpret_cast<>。您也可以在Windows 7或Windows Vista上的旧版Windows桌面应用程序中使用Microsoft::WRL::ComPtr

尽管如此,WRL和C ++ / CX是两个不同的东西。

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

相关问题