我有这个参考类:
namespace N
{
public ref class S sealed
{
public:
property Platform::String^ x;
};
}
如何使用聚合初始化程序将其初始化? 我试过了:
N::S s1 = { %Platform::String(L"text") };
但是编译器说
错误C2440:'初始化':无法转换为'初始化列表'至 ' N :: S'
此外:
N::S s1 { %Platform::String(L"text") };
,错误是:
错误C2664:' N :: S :: S(const N :: S%)':无法转换参数1 ' Platform :: String ^'到' const N :: S%'
这对标准的c ++非常有用:
struct T
{
wstring x;
};
T x { L"test" };
我不想在这里使用构造函数。
答案 0 :(得分:0)
我认为你的意思是你不想在预计的WinRT类型上使用public
构造函数 - 没问题,你可以使用internal
关键字来表示" C ++中的public但不是通过互操作曝光#34;这意味着如果您愿意,甚至可以使用本机C ++类型作为参数:
namespace Testing
{
public ref class MyTest sealed
{
public:
property String^ Foo {
String^ get() { return m_foo; }
void set(String^ value) { m_foo = value; }
}
internal:
// Would not compile if it was public, since wchar_t* isn't valid
MyTest(const wchar_t* value) { m_foo = ref new String(value); }
private:
String^ m_foo;
};
}
MainPage::MainPage()
{
// Projected type does NOT have this constructor
Testing::MyTest t{ L"Hello" };
OutputDebugString(t.Foo->Data());
t.Foo = "\nChanged";
OutputDebugString(t.Foo->Data());
}
此外,您不需要使用private
变量来保存字符串 - 您可以像在原始代码中一样使用自动属性 - 但我更喜欢明确。这也意味着如果你需要在C ++代码中大量访问字符串,你可以提供一个internal
访问器函数,而不必通过vtable调用来获取它。