我有一个XAML + DirectX应用程序,我想在我的“interop”类中添加静态字段:
[Windows::Foundation::Metadata::WebHostHidden]
public ref class Direct3DInterop sealed : public Windows::Phone::Input::Interop::IDrawingSurfaceManipulationHandler
{
public:
static int VALUE = 0;
...
};
它没有编译说“只能在类中初始化静态const积分数据成员”。
如果我将其更改为const static int VALUE = 0;
,那么它仍然无法编译并显示错误“非值类型不能包含任何公共数据成员”
我做错了什么?
答案 0 :(得分:1)
WinRT公共类有许多限制,以确保它们可以被多种语言使用,包括C ++,JavaScript和C#。这就是您收到错误C3984的原因。您不能拥有公共字段,而必须使用properties。您将其设为只读属性:
property int VALUE
{
int get() { return 0; }
}
重要的是要记住,属性是函数调用,并且通常无法优化,因此在设计接口时应考虑这一点。
如果您打算让此类仅可由C ++使用,请考虑不使用WinRT类,而是使用您使用std::unique_ptr
或std::shared_ptr
管理生命周期的简单C ++类。在这种情况下,您当然可以一如既往地使用公共字段方法。
您遇到的最初问题是一般的C ++语言限制,不是特定于WinRT的。错误C2864(您在发布的文本中使用VS 2012)在VS2013中使用C ++ 11时更为通用。