在模板功能中警告C4091

时间:2018-05-17 14:51:13

标签: c++ visual-studio-2017

我有在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

如果我想保持类型检查(并且不需要警告:)我该怎么办?)?

2 个答案:

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

这样做也会保持类型检查。