在Visual Studio 2015社区C ++中,如何修复警告C4838:从'unsigned int'到'int'的转换需要缩小转换范围



我正试图在win32 API(无mfc)上编写一些直接的c++。有了这个更现代的c++编译器,我得到了:

警告C4838:从"unsigned int"到"int"的转换需要缩小转换

它发生在以下代码中:

EvMap<DlgCtl> DlgCtl::_evMap [] = {
    {IDC_LIST, NM_CLICK, & DlgCtl::Pik},
    {0}
};

riiiiiight在闭合支架的前面。控件id的0表示数组结束。此代码将控件id和事件id映射到本地函数,类似于MFC的操作。

我想缩小转换意味着在无符号的in到int的隐式转换中会失去精度(因为无符号可以保持>32767,而int不能)
我不知道无符号的int是什么。有一个0,但那是有符号的int,对吧?下面的代码使用列表来调度winprocish类中的类本地函数。

template <class T>
struct EvMap {int ctrl, evnt;  void (T::* func)(LPARAM l);};

template <class T>
bool DoEvMap (T *ths, EvMap<T> *evMap, int ctrl, int evnt, LPARAM l)
{
//DBG("DoEvMap ctrl=`d evnt=`d", ctrl, evnt);
    for (int i = 0;  evMap [i].ctrl;  i++) {
//DBG(" - check ctrl=`d evnt=`d", evMap [i].ctrl, evMap [i].evnt);
       if ((ctrl == evMap [i].ctrl) && (evnt == evMap [i].evnt))
           {(ths->*(evMap [i].func)) (l);   return true;}
    }
    return false;
}

我不想关闭警告,因为这只是一种糟糕的形式;int>(0),但警告相同。

使用这个讨厌的编译器,我该如何继续生活?

编译器警告的unsigned intIDC_LISTNM_CLICK,因为显然0不是unsigned int

所以这两者中的任何一个都应该是有符号的,ctrlevnt应该是无符号的。