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;

但我收到以下编译器错误:

程序文件 (x86)\microsoft visual studio 11.0\vc\include\collection.h(1118):错误 C3986:“调用”:公共成员的签名包含本机类型“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或者您正在以某种方式使用它,它的类型最终是公共或受保护成员的类型。

Platform::Collections::Map类型是接口的 C++/CX 特定实现Windows::Foundation::Collections::IMap。声明 Windows 运行时类型的公共成员时,您需要使用IMap,而不是Map,因为Map依赖于 C++ 和 C++/CX 特定的语言功能,这些功能在 Windows 运行时 ABI 中不可用。

简而言之,如果你改变你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^>());

考虑使用一些typedefs 使代码更清晰:

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 回答