我具有以下类层次结构:

class FilterMktData
{
   virtual std::vector<std::string> filter(std::vector<std::string>) = 0;
   ...
}


class FilterMktDataDecorator : public FilterMktData
{
   virtual std::vector<std::string> filter(std::vector<std::string>);
   ...
}


template<typename T>
class FilterBy : public FilterMktDataDecorator
{
   std::vector<std::string> filter(std::vector<std::string>);
   ...
}


class FilterByVolume : public FilterBy<int>
{
   ...
}


我正在使用装饰器模式。 FilterMktData是接口,FilterMktDataDecorator是提供接口实现的类,该接口将实际工作委托给FilterMktData的内部共享指针。该指针传递给构造函数。

现在,类模板FilterBy通过使用传递给构造函数的lambda表达式来实现filter方法(我使用的是std::function<bool(T)>类型的参数)。想法是过滤在求值时返回true的元素。必须引入模板,因为元素是std::string,必须先进行转换,然后才能将其传递给lambda表达式,并且可以是任何东西。

最后,FilterByVolume将lambda表达式传递给FilterBy<int>的构造函数,如果体积小于某个值,则该构造函数返回true。

我已经测试了类的行为,并且它们按预期工作。唯一的问题是我得到以下编译器警告

FilterBy.h(51): warning C4505: 'FilterBy<int>::filter' : unreferenced local function has been removed


仅当在main.cpp中包含FilterByVolume的头文件时,而不是在我为FilterBy包含头文件时,即使我的main没有实例化上述类的任何对象时,也没有。

问题:如何消除警告?

谢谢你的帮助。

最佳答案

您可以通过在导致问题的函数之前将以下行放在.h文件中来消除警告:

#pragma warning(push)
#pragma warning(disable : 4505)
#endif


之后,您可以再次启用该警告(例如,针对不是您的其他头文件):

#pragma warning(pop)


请注意,此编译指示是特定于Visual Studio的,其他编译器可能对此有所抱怨。因此,您可能需要将它们都包装在额外的#ifdef _WIN32 ... #endif部分中。

07-27 19:43