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

Posted

技术标签:

【中文标题】C++:当包含从类模板派生的类的标头时,编译器警告 C4505【英文标题】:C++: compiler warning C4505 when including header of class derived from class template 【发布时间】:2015-12-17 11:38:31 【问题描述】:

我有以下类层次结构:

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 表达式来实现过滤器方法(我使用的是 std::function&lt;bool(T)&gt; 类型的参数)。这个想法是过滤评估时返回true的元素。有必要引入模板,因为元素是 std::strings 并且必须在将它们传递给 lambda 表达式之前进行转换,并且可以是任何东西。

最后,FilterByVolume 将 lambda 表达式传递给 FilterBy&lt;int&gt; 的构造函数,如果音量小于某个值,则返回 true。

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

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

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

问题:如何消除警告?

感谢您的帮助。

【问题讨论】:

这个警告是噪音。永远不要为 C++ 代码启用它。 【参考方案1】:

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

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

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

#pragma warning(pop)

请注意,此编译指示是特定于 Visual Studio 的,其他编译器可能会抱怨它。因此,您可能希望将两者都包装在一个额外的 #ifdef _WIN32 ... #endif 部分中。

【讨论】:

谢谢。我将尝试使用其他编译器,看看它们是否会发出警告。我正在使用 CMake 进行构建,我不希望在使用其他编译器时看到警告。 g++ 在使用-Wall 选项编译时会抱怨编译指示,并带有警告ignoring #pragma warning [-Wunknown-pragmas]。这可以通过将编译指示放入特定于 Windows 或 MSVC 的#ifdef 来规避,例如#ifdef _WIN32.

以上是关于C++:当包含从类模板派生的类的标头时,编译器警告 C4505的主要内容,如果未能解决你的问题,请参考以下文章

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

从模板参数派生的类

c++基类包含派生类的实例

C++ 静态多态性 (CRTP) 和使用派生类的 typedef

c++派生类的类型列表

从类中调用函数时抛出NullObjectReference