模板功能中的警告 C4091

Warning C4091 in template function

本文关键字:警告 C4091 功能      更新时间:2023-10-16

我有在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)
{
}

具有适当的特征。