首页 > 解决方案 > 模板函数中出现警告 C4091

问题描述

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

如果我想继续进行类型检查(并且不想要警告:)),我应该怎么做?

标签: c++visual-studio-2017

解决方案


一种简单的方法

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)
{
}

具有适当的特征。


推荐阅读