我具有以下类层次结构:
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
部分中。