1

私が最近C++/ CXを学び始めたので、これがばかげた質問であるならば、私と一緒に耐えてください。値クラスrefクラスに関するMSDNドキュメントを調べていたところ、次の例外に遭遇しました。

値クラスまたは値構造体のすべてのメンバーはパブリックであり、メタデータに出力されるため、標準のC++タイプは許可されていません。

[refクラス]には、C ++ / CX構造、またはenumクラス、refクラス、float64などのスカラー型をメンバーとして含めることができます。また、標準のC++タイプが含まれている場合もあります。C ++ / CX構造には、パブリック、プロテクト、内部、プライベート、またはプロテクトされたプライベートアクセスがあります。パブリックメンバーまたは保護されたメンバーはメタデータに送信されます。標準のC++タイプには、プライベート、内部、または保護されたプライベートアクセスが必要です。これにより、メタデータに出力されなくなります。


私の質問は、「C ++ /CXコンストラクト」と「標準C++タイプ」の定義は何ですか?

私の推測が正しければ、C ++ / CX構造体にはrefクラスと構造体、enumクラスと構造体が含まれ、標準のC ++型にはint、bool、float、doubleなどが含まれます。

4

1 に答える 1

4

ドキュメントに「C++/ CXコンストラクト」と記載されている場合、それはWindowsランタイムタイプを意味します。C ++ / CXを使用してプログラミングする場合、タイプには2つのカテゴリがあります。

  1. C ++型:C ++型のセットには、通常のC ++コードで使用できるすべての型(基本型(intまたはdouble)、列挙型、ポインター、参照、クラス型など)が含まれます。

  2. Windowsランタイムタイプ:これらは、WindowsランタイムABIの境界を越えて使用できるタイプです。これらには、参照型(ref class)、Windowsランタイム値型(value class、数値型、Windowsランタイム列挙など)およびデリゲートが含まれます。

これらのカテゴリの間には少し重複があることに注意してください。数値タイプは両方にあります。

C ++型は、作成するパブリックコンポーネントのパブリックサーフェスを除いて、コード内のどこでも使用できます。WindowsランタイムABIの境界を越えて使用できるのは、Windowsランタイムタイプのみです。例えば:

public ref class C sealed 
{
public:

    // Ok:  int is a fundamental WinRT type
    void F(int x) { } 

    // Not ok:  std::string is not a WinRT type
    void G(std::string s) { } 

private:

    // Ok:  _s is private; private members are implementation details, so you
    // may use ordinary C++ types for private members.
    std::string _s; 
};

これらの2つのタイプのカテゴリは、C ++でのWindowsランタイムコンポーネントの構築に固有のものではありません。.NETでコンポーネントを構築する場合は、.NET固有の型(具体的なジェネリック型など)と.NET固有の構造(ジェネリックメソッドなど)を使用できます。 )、これは有効なWindowsランタイムタイプではありません。

于 2012-09-21T00:14:05.937 に答える