我正试图在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 int
是IDC_LIST
或NM_CLICK
,因为显然0
不是unsigned int
。
所以这两者中的任何一个都应该是有符号的,或ctrl
或evnt
应该是无符号的。