2012-08-25 39 views
0

Im a c#dev试图进入C++,并编写一些自定义控件。 我需要的C++当量以下络合物C#字典Platform :: Collections :: Map - 使用枚举键作为

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 
}; 

IVE定义的映射在我的头文件中像这样

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

但即时得到以下编译器错误:

程序文件(x86)\微软的Visual Studio 11.0 \ vc \ include \ collection.h(1118):error 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^>^>(); 
    } 
} 

希望帮助您重现该问题

由于任何人谁是抽出时间来帮我整理了这一点

+0

一个问题可能是'公共枚举类PinchscapeColor'是无效的C++语法。这些枚举是在一个类中声明的吗? – juanchopanza

+0

它们在头文件中声明,他们是一样的对C微软的示例代码++/CX –

+0

C++枚举没有访问修饰符,而'枚举class'是声明的C++ 11的方法类型安全枚举。我不熟悉C++/cx,所以这可能是一个扩展。 (顺便说一下,是不是有一个cx标签呢?如果不是,你应该可以制作一个)。 – Cubic

回答

1

你的,因为它是在问题提出的代码是良好和不使用RTM错误编译发布Visual Studio 2012.

虽然我可以推测你的问题的原因:很可能你正在使用此colorMap(或其类型)作为公共或受保护的公共成员ref class或您以某种方式使用它,它的类型最终会成为公共或受保护成员的类型。

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

总之,如果你改变你的colorMap使用IMap,它应该解决的问题:

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

当你实例化这一点,你需要先实例外部映射,那么每个内的地图,使用他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 s到使代码更清晰:

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; 
+0

是的,但你不能实例化一个IMAP,如果你改变实例化到地图,而不是,错误回来了。 –

+0

我感到我们都在吠叫错误的树,并且问题是使用枚举作为字典键。谷歌搜索的TON后,我得到你需要在地图构造函数使用一种类型的比较器的端倪,但我能找到任何的例子 - 我敢肯定,这一定是简单的 - 我不能相信没有一个简单的解决方案。 –

+0

如果您可以发布一个最小,完整,独立的示例来演示错误以及您正在尝试完成的任务,那么我可以帮助您找出解决方案。您可以确实使用枚举作为关键类型。你不能实例化一个'IMap',否,但是'Map'实现'IMap'接口。尽管如此,你可能根本不需要WinRT映射:'std :: map'可能足以满足大多数用途。 –