考虑以下C++示例main.cpp文件:
class FooIf
{
public:
virtual int handle(char *req, char *res) = 0;
};
class BarIf
{
public:
virtual void handle(char *msg) = 0;
};
class Bar : private BarIf
{
private:
void handle(char * msg){}
};
class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
int handle(char *req, char *res){ return (0); }
};
int main(){
Zoo zoo;
return (0);
}我收到这样的警告:
$ clang++ -ggdb -c main.cpp -Wall
main.cpp:23:6: warning: 'Zoo::handle' hides overloaded virtual function [-Woverloaded-virtual]
int handle(char *req, char *res){ return (0); }
^
main.cpp:17:7: note: hidden overloaded virtual function 'Bar::handle' declared here: different number of parameters (1 vs 2)
void handle(char * msg){}
^现在..。我确实把Bar::handle藏起来了,而且我是故意做的。
有什么方法可以避免在传递警告的同时抑制警告呢?
没有必要说g++根本没有抱怨过这一点。
发布于 2016-09-29 13:55:51
你应该考虑另一种设计。如果您真的需要这样做的话,这似乎是一个代码嗅探/设计问题。
如果(无论出于什么原因)你真的想这样做,你可以在特定的地方关闭警告。见这里获取信息http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas
在你的情况下,这会是这样的
class Zoo : public FooIf, public Bar
{
public:
using FooIf::handle;
public:
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Woverloaded-virtual"
int handle(char *req, char *res){ return (0); }
#pragma clang diagnostic pop
};发布于 2016-09-29 14:42:19
警告可以识别可能出现的问题。
可能是这里的一个关键词。如果忽略警告,代码可以完全正常运行。但在数以百万计的开发人员超过数万亿行代码的经验中,编译器不得不说“这是个坏主意”。
修复它包括抑制警告,或者简单地重命名方法。
这是一个潜在的警告,因为该类中handle的含义因您调用它的方式而不同。此外,人们有时会意外地给函数赋予一个稍微不同的签名,从而导致它无法过载。
在两者之间,将其标记为警告是值得的。
修复它的最佳途径将取决于您的问题中没有显示的细节。
https://stackoverflow.com/questions/39772139
复制相似问题