1>c:\program files\microsoft visual studio 10.0\vc\include\map(229): warning C4180:
qualifier applied to function type has no meaning; ignored
1> d:\...\gmproject.h(122)
: see reference to class template instantiation 'std::map<_Kty,_Ty>'
being compiled
1> with
1> [
1> _Kty=GMProject::DuplicateTy,
1> _Ty=GMProject::DuplicateFn
1> ]
我的班级有这些typedef(pTree是一个容器):
typedef void *DuplicateFn(pTree&, const pTree&);
enum DuplicateTy {
SKIP,
OVERWRITE,
ASK
};
typedef std::map<DuplicateTy, DuplicateFn> DuplicateMapTy;
第122,123行是:
static const DuplicateMapTy DuplicateFns;
static DuplicateMapTy DuplicateFns_INIT();
如何指示此地图无法更改 - 并使其对班级保持静态? 我的目标是创建一个地图,以便我可以从枚举中“获取”一个函数指针。 (客户端代码将提供枚举,然后类本身将枚举解析为函数)。
答案 0 :(得分:3)
这个问题与地图是const无关:这是一个警告,因为std::map::at()
的const版本的返回类型是const mapped_type&
。此代码也会产生警告:
typedef void *DuplicateFn();
typedef std::map< int, DuplicateFn > DuplicateMapTy;
DuplicateMapTy DuplicateFns;
这里的地图at
的后退类型是
const DuplicateFn&
虽然这个警告有它的位置(虽然我在这种特殊情况下不太确定它是否符合标准),在这种情况下,使用地图在本地禁用它应该没有害处,或者如果你不喜欢pragma麻烦,把你的函数指针包装成一个简单的结构。
编辑正如Gorpik在下面的评论中指出的那样,虽然未使用此功能,但实际上是在该特定位置生成的。看起来VS编译器在寻找警告时确实很有侵略性:它确实考虑了声明。
template< class T >
struct CheckMe
{
const T& at() //warning C4180 pops up
{
//gets not instantiated hence no error for missing returntype
}
};
CheckMe< DuplicateFn > check;