模板功能中的警告 C4091
Warning C4091 in template function
我有在VS-2010中编译的代码,没有警告:
class MyClass {
public:
class InternalClass;
};
class MyClass::InternalClass {
};
template<class QWERTY>
void Func( QWERTY& arg )
{
typename QWERTY::InternalClass;
}
int main()
{
MyClass var;
Func( var );
return 0;
}
现在我在VS-2017中编译此代码并收到警告4091:
warning C4091: '': ignored on left of 'MyClass::InternalClass' when no variable is declared
如果我想保持类型检查(并且不想:)警告(,我该怎么办?
警告抱怨此行
typename QWERTY::InternalClass;
什么都不做,因为你没有声明一个变量或对它做任何有意义的事情。 它本质上与拥有一行
int;
要摆脱警告,一个简单的解决方法是实际使用它。
using MyType = typename QWERTY::InternalClass;
//or
typename QWERTY::InternalClass myObj;
//myObj....
这样做也会保留类型检查。
一种简单的方法
template <class QWERTY,
typename SFINAE = typename QWERTY::InternalClass>
void Func( QWERTY& arg )
{
}
陷阱是Func<int, void>(i)
是正确的。
更正确(也更详细(的方法是:
template <class QWERTY,
std::enable_if_t<hasInternalClass<QWERTY>::value, void*> = nullptr>
void Func(QWERTY& arg)
{
}
具有适当的特征。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 禁止显示由于常量为零而比较始终为假的警告
- C++ 警告:将新创建的 gsl::owner<> 分配给非所有者
- 模板功能中的警告 C4091