公共成员的签名包含本机类型

时间:2014-02-23 12:57:11

标签: windows-runtime c++-cx

我是visual c ++的新手,我有以下代码:

ref class Book sealed
{
public:
    Book(std::string title,std::string author,int year);
    void setTitle(std::string title);
    std::string getTitle() const;
    int getYear() const;
    void setYear(int year);
    void setAuthor(std::string author_);
    std::string getAuthor() const;

private:
    std::string title_;
    std::string author_;
    int year_;

};

当我尝试编译它时,我收到以下错误:

{ctor} signature of public member contains native type。我想这是因为我使用的是std :: string而不是Platform :: String,我该如何解决?

2 个答案:

答案 0 :(得分:7)

您的ref类本身并未标记为public,因此您似乎只在内部(作为源代码)从其他C ++中使用此类,并且不打算将其发布给其他WinRT使用者。

如果是这种情况,您可以将构造函数设置为internal而不是public,这将在此组件中公开,并且在外部不可见。如果这是你的预期用途,那么它可以只是一个普通的“课堂”而不是“参考课程”。如果您确实希望在WinRT边界使用它,但您不需要构造函数,则可以将其设置为“公共引用类”并将构造函数标记为“内部”。有点取决于你的情况。

如果你想让这个类公开有一个可以在WinRT边界使用的公共构造函数(这样它可以被C#/ VB / JS使用),那么你需要使用WinRT类型(例如Platform::String)。在你的类中,存储类型仍然可以是std::string(尽管我建议使用std :: wstring,否则你需要进行从宽到窄的转换,因为Platform :: Strings是宽字符串)。

要在这两种类型之间进行转换,请使用Platform::String::Data()来获取可用于构建wchar_t*的基础std::wstring。同样地,Platform::String有一个构造函数,它带有wchar_t*(你可以从std::wstring::c_str()获得)。

答案 1 :(得分:0)

您无法在托管引用类中保留本机类型。

你只能拥有一个指向非托管对象的指针(指针毕竟只是一个数字,这就是允许的原因)。