首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >故意隐藏过载函数警告避免

故意隐藏过载函数警告避免
EN

Stack Overflow用户
提问于 2016-09-29 13:47:36
回答 2查看 932关注 0票数 0

考虑以下C++示例main.cpp文件:

代码语言:javascript
复制
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);
}

我收到这样的警告:

代码语言:javascript
复制
$ 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++根本没有抱怨过这一点。

EN

回答 2

Stack Overflow用户

发布于 2016-09-29 13:55:51

你应该考虑另一种设计。如果您真的需要这样做的话,这似乎是一个代码嗅探/设计问题。

如果(无论出于什么原因)你真的想这样做,你可以在特定的地方关闭警告。见这里获取信息http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas

在你的情况下,这会是这样的

代码语言:javascript
复制
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
};
票数 5
EN

Stack Overflow用户

发布于 2016-09-29 14:42:19

警告可以识别可能出现的问题。

可能是这里的一个关键词。如果忽略警告,代码可以完全正常运行。但在数以百万计的开发人员超过数万亿行代码的经验中,编译器不得不说“这是个坏主意”。

修复它包括抑制警告,或者简单地重命名方法。

这是一个潜在的警告,因为该类中handle的含义因您调用它的方式而不同。此外,人们有时会意外地给函数赋予一个稍微不同的签名,从而导致它无法过载。

在两者之间,将其标记为警告是值得的。

修复它的最佳途径将取决于您的问题中没有显示的细节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39772139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档