我如何在cpp-winrt idl文件和普通/标准cpp类中使用相同的名称空间名称?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我如何在cpp-winrt idl文件和普通/标准cpp类中使用相同的名称空间名称?相关的知识,希望对你有一定的参考价值。
该场景是新的,我相信这可能是cpp-winrt模块或vc编译器中的错误。
问题1.使用通用窗口的cpp-winrt模板创建“ Windows运行时组件”。2.注意在idl文件中定义的名称空间名称。默认情况下,idl文件名为class.idl。3.使用类向导将“新的标准cpp类”添加到项目中。4.将新类放在与idl文件中定义的名称空间名称相同的名称下。5.构建项目。一种。构建应该成功。6.在运行时实现类中使用标准cpp类。7.现在尝试再次构建项目。一种。这次构建将失败。
原因1. cppwinrt.exe从idl文件生成源文件。2.运行时实现类名称空间以“ winrt”为前缀。3.标准cpp类未以名称空间“ winrt”作为前缀。4. vc编译器期望标准cpp类命名空间从“ winrt”开始5. 否则,即使尝试使用完全限定的名称空间名称,名称解析也会失败。
示例运行时IDL文件
namespace NMLevel1.NMLevel2
{
[default_interface]
runtimeclass Class
{
Class();
void RuntimeMethod1();
Int32 RuntimeMethod2(Int32 arg1);
String RuntimeMethod3(String arg1);
Int32 MyProperty;
}
}
标准cpp文件示例
#pragma once
#include <string>
using namespace std;
namespace NMLevel1::NMLevel2
{
class StdCPPClass
{
public:
StdCPPClass();
virtual ~StdCPPClass();
void method1();
int method2(int arg1);
wstring method3(wstring arg1);
};
}
示例运行时类实现
#include "pch.h"
#include "Class.h"
#include "NMLevel1.NMLevel2.Class.g.cpp"
#include "StdCPPClass.h"
using namespace winrt;
using namespace Windows::Foundation;
namespace winrt::NMLevel1::NMLevel2::implementation
{
void Class::RuntimeMethod1()
{
NMLevel1::NMLevel2::StdCPPClass stdcls;
Uri uri(L"http://aka.ms/cppwinrt");
//printf("Hello, %ls!
", uri.AbsoluteUri().c_str());
printf("RuntimeMethod1(): Hello, %ls!
", stdcls.method3(uri.AbsoluteUri().c_str()).c_str());
}
}
NMLevel1 :: NMLevel2 :: StdCPPClass stdcls;在不给名称空间加上winrt的情况下是不允许的。
这是无法克服的错误或设计限制吗?或如何在idl和cpp文件中使用相同的名称空间'NMLevel1 :: NMLevel2'?
C ++中的名称查找相当复杂,特别是当名称空间实际上是通过using
声明合并时。为了帮助编译器识别所需的名称,您必须明确,并使用完全限定名称(与示例中的限定名称相反)。
您必须更改
void Class::RuntimeMethod1()
{
NMLevel1::NMLevel2::StdCPPClass stdcls;
// ...
}
to
void Class::RuntimeMethod1()
{
::NMLevel1::NMLevel2::StdCPPClass stdcls;
// ...
}
请注意领先的::
范围解析,它限制了对全局范围(或通过using
声明引入全局名称空间的名称空间)的查找。您可以在此处找到其他信息:Qualified name lookup。
以上是关于我如何在cpp-winrt idl文件和普通/标准cpp类中使用相同的名称空间名称?的主要内容,如果未能解决你的问题,请参考以下文章