视觉工作室的神秘警告(4180)

时间:2011-11-24 10:36:42

标签: c++ visual-studio function-pointers

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();

如何指示此地图无法更改 - 并使其对班级保持静态? 我的目标是创建一个地图,以便我可以从枚举中“获取”一个函数指针。 (客户端代码将提供枚举,然后类本身将枚举解析为函数)。

1 个答案:

答案 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;