C++ 如何初始化类';值为结构的私有成员静态映射?

C++ 如何初始化类';值为结构的私有成员静态映射?,c++,data-structures,map,static,C++,Data Structures,Map,Static,我有一个类,其私有成员是静态映射: Class Devices { ... private: struct DevicePair { int nCtr; bool isToAdd; }; DevicePair m_DevPair; static map <string, DevicePair> m_SYSdeviceMap; }; 类设备 { ... 私人: 结构设备空气 { 国

我有一个类,其私有成员是静态映射:

Class Devices
{   
    ...
    private:
    struct DevicePair
    {
       int nCtr;
       bool isToAdd;
    };
    DevicePair m_DevPair;
    static map <string, DevicePair> m_SYSdeviceMap;    
};
类设备
{   
...
私人:
结构设备空气
{
国际非关税贸易关系;
布尔伊斯托加;
};
DevicePair m_DevPair;
静态映射m_SYSdeviceMap;
};
为什么我不能在cpp文件中这样做

map <string, DevicePair> Devices::m_SYSdeviceMap;
映射设备::m_SYSdeviceMap;
如何在cpp文件中初始化它?

使用以下行:

map<string, Devices::DevicePair> Devices::m_SYSdeviceMap;
映射设备::m_SYSdeviceMap;

另外,作为一种良好的编码实践,使用名称空间std删除
DeviceAir
在该范围内,您必须是
设备::

私有静态通常是一个坏主意。顺便说一下,您最好将此实例隐藏在.cpp文件的“匿名命名空间”部分,在该部分中,编译单元中的函数(通常是类成员)可以看到它,但外部文件看不到它

原因是它是一个向类的所有用户公开的实现细节

在您的情况下,这将很难做到,因为
DevicePair
在您的类中是私有的,您不能简单地移动它,因为m_DevPair的标题中需要它

当然,如果您需要类是线程安全的,那么您需要一个互斥体等来控制对映射的访问(除非它在一个线程中初始化,然后仅由多个线程读取)。互斥锁当然会在匿名名称空间中(而且几乎肯定应该是)


不过,我还是会重新考虑您的设计。

为什么我们要避免使用“使用命名空间std”?:D@Owen因为它用许多可能不需要的类型和方法污染了全局名称空间。