visual studio中的神秘警告(4180)
cryptic warning in visual studio (4180)
1>c:program filesmicrosoft visual studio 10.0vcincludemap(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> ]
我的类有这些类型定义(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();
我如何指示这个映射不能更改-并使它对类是静态的?我的目标是创建一个映射,这样我就可以从枚举中"获取"一个函数指针。(客户端代码将提供枚举,然后类本身将枚举解析为函数)。
这个问题与const映射无关:这是一个警告,因为std::map::at()
的const版本的返回类型是const mapped_type&
。下面的代码同样会产生警告:
typedef void *DuplicateFn();
typedef std::map< int, DuplicateFn > DuplicateMapTy;
DuplicateMapTy DuplicateFns;
这里map的at
的返回类型是
const DuplicateFn&
虽然这个警告有它的地方(尽管我不太确定在这种特殊情况下它是否符合标准),在这种情况下,在使用map的代码中局部禁用它应该没有什么害处,或者如果你不喜欢编译麻烦,可以将函数指针包装成一个简单的结构体。
edit正如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;
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- visual studio中的神秘警告(4180)