我有在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
如果我想保持类型检查(并且不需要警告:)我该怎么办?)?
答案 0 :(得分:1)
一种简单的方法
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)
{
}
具有适当的特征。
答案 1 :(得分:1)
该警告正在抱怨此行
typename QWERTY::InternalClass;
没有做任何事情,因为你没有声明变量或对它做任何有意义的事情。它与
行基本相同int;
要摆脱警告,一个简单的解决方法是实际使用它。 e.g。
using MyType = typename QWERTY::InternalClass;
//or
typename QWERTY::InternalClass myObj;
//myObj....
这样做也会保持类型检查。