0

私は ac# dev として C++ に取り組もうとしており、いくつかのカスタム コントロールを作成しています。次の複雑な c# 辞書に相当する c++ が必要です

private static Dictionary<PinchscapeColor, 
        Dictionary<PinchscapeColorLevel, Brush>> AccentColorMap;

PinchscapeColor と PinchscapeColorLevel は単純な c# 列挙型です

public enum PinchscapeColorLevel
{
    Light,
    Medium
    Dark
}

public enum PinchscapeColor
{
    PinchscapeCyan,
    PinchscapeLime,
    PinchscapeMagenta,
    PinchscapeTangerine,
    PinchscapePlum
}

そして、このような特定の色/色レベルの組み合わせを計算します(c#で)

var color = AccentColorMap[PinchscapeColor.PinchscapeCyan][PinchscapeColorLevel.Dark];

C ++でこれを行う私の試みは、ある程度まで成功しました:

私の列挙型:

public enum class PinchscapeColorLevel
{
    Light,
    Medium,
    Dark
};

public enum class PinchscapeColor
{
    PinchscapeCyan,
    PinchscapeLime,
    PinchscapeMagenta,
    PinchscapeTangerine,
    PinchscapePlum
};

このようにヘッダーファイルにマップを定義しました

Platform::Collections::Map<PinchscapeBasicControls::PinchscapeColor,
    Platform::Collections::Map<PinchscapeBasicControls::PinchscapeColorLevel,
    Windows::UI::Xaml::Media::Brush^>^>^ colorMap;

しかし、次のコンパイラエラーが発生します:

program files (x86)\microsoft visual studio 11.0\vc\include\collection.h(1118): エラー C3986: 'Invoke': パブリック メンバーの署名にネイティブ型 'std::less<_Ty>' が含まれています (最初の行です) 、それは永遠に続く)

誰かが私が間違っていることについて何か考えがありますか? 私はこれが簡単になるだろうと想像していました:(

編集

問題を再現するために必要なすべてのコードである最小限のコード例を以下に示します。

1) Class1.h

#pragma once

namespace WindowsRuntimeComponent1
{
    public enum class ColorLevelEnum
    {
        Light,
        Medium,
        Dark
    };

    public enum class ColorEnum
    {
        Cyan,
        Lime,
        Magenta,
        Tangerine,
        Plum
    };

    public ref class Class1 sealed
    {
    private:
        Windows::Foundation::Collections::IMap<WindowsRuntimeComponent1::
            ColorEnum,Windows::Foundation::Collections::IMap<WindowsRuntimeComponent1::
            ColorLevelEnum,Windows::UI::Xaml::Media::Brush^>^>^ colorMap;
    public:
        Class1();
    };
}

Class1.cpp

#include "pch.h"
#include <collection.h>
#include "Class1.h"

using namespace WindowsRuntimeComponent1;
using namespace Windows::UI::Xaml::Media;
using namespace Platform::Collections;
using namespace Platform;

Class1::Class1()
{
    if (colorMap == nullptr)
    {
        colorMap = ref new Map<ColorEnum,Map<ColorLevelEnum,Brush^>^>();
    }
}

問題の再現に役立つことを願っています

これを整理するために時間を割いてくれた人に感謝します

4

1 に答える 1

1

質問に示されているコードは整形式であり、Visual Studio 2012 の RTM リリースを使用してエラーなくコンパイルされます。

ただし、問題の原因については推測できます。これcolorMap(またはそのタイプ)をパブリックまたはパブリックのプロテクトメンバーとしてref class使用しているか、そのタイプが終了する何らかの方法で使用している可能性がありますpublic または protected メンバーの型であること。

このPlatform::Collections::Map型は、インターフェースの C++/CX 固有の実装ですWindows::Foundation::Collections::IMap。Windows ランタイム型のパブリック メンバーを宣言するときは、Windows ランタイム ABI では使用できない C++ および C++/CX 固有の言語機能に依存しているためIMap、 ではなくを使用する必要があります。MapMap

つまり、colorMapを使用するように変更するとIMap、問題が解決するはずです。

IMap<
    PinchscapeColor,
    IMap<
        PinchscapeColorLevel,
        Brush^
    >^
>^ colorMap;

これをインスタンス化するときは、最初に外側のマップをインスタンス化し、次に he を使用して各内側のマップをインスタンス化する必要がありますPlatform::Collections::Map。例えば:

// Create the outer map; note the "value type" is still IMap<T, U>
colorMap = ref new Map<ColorEnum,IMap<ColorLevelEnum,Brush^>^>();

// Insert an element into the outer map:
colorMap->Insert(ColorEnum::Cyan, ref new Map<ColorLevelEnum, Brush^>());

typedefコードをより明確にするために、いくつかの を使用することを検討してください。

typedef IMap<PinchscapeColorLevel, Brush^>          IColorLevelBrushMap;
typedef IMap<PinchscapeColor, IColorLevelBrushMap^> IColorMap;

IColorMap^ colorMap;

または、このマップを他の Windows ランタイム コンポーネントにアクセス可能にする必要がない場合は、 の使用を検討してください。これにより、パフォーマンスが大幅std::mapに向上します。

typedef std::map<PinchscapeColorLevel, Brush^>        ColorLevelBrushMap;
typedef std::map<PinchscapeColor, ColorLevelBrushMap> ColorMap;

ColorMap colorMap;

または:

typedef std::pair<PinchscapeColor, PinchscapeColorLevel> ColorMapKey;
typedef std::map<ColorMapKey, Brush^>                    ColorMap;

ColorMap colorMap;
于 2012-08-25T18:30:30.317 に答える