C++:当包含从类模板派生的类的 header 时,编译器警告 C4505

标签 c++ templates design-patterns compiler-warnings

我有以下类层次结构:

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是提供接口(interface)实现的类,该接口(interface)将实际工作委托(delegate)给指向 FilterMktData 的内部共享指针。此指针传递给构造函数。

现在,类模板FilterBy通过使用传递给构造函数的 lambda 表达式实现 filter 方法(我使用的是 std::function<bool(T)> 类型的参数)。这个想法是过滤评估时返回的元素 true .有必要引入模板,因为元素是std::string s 并且必须在将它们传递给 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 部分中。

关于C++:当包含从类模板派生的类的 header 时,编译器警告 C4505,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34333667/

相关文章:

c++ - C++模板类的内部类访问

java - 乐观缓存并发设计模式

java - hibernate pojo 过度暴露

c++ - Const std::filesystem::path 引用常量不受尊重,这是我做错的吗?

c++ - 使用推力(素数)在 GPU 中编译

C++,非模板类中的模板变量

.net - 依赖注入(inject)和代码混淆

c++ - 如何让 Eclipse CDT 忽略文件

c++ - 获取 COM 设备的描述

c++ - 继承类模板有好处吗?