gpt4 book ai didi

c++ - 从多个模板化基类派生时出现 "hides overloaded virtual functions"警告

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:04 26 4
gpt4 key购买 nike

假设下面的代码:

基础.h

template <class T>
class Base
{
public:
virtual void func(T value) {}
};

派生.h

class Derived : public Base<Type1>
, public Base<Type2>
{
public:
void func(Type1 object) override {}
};

基本上我有一个模板化类,它有一个成员函数,该成员函数接受模板类型的参数。派生类派生自具有两个不同类类型的基类,并覆盖其中一个的功能。

使用 Clang 编译器时,它会生成一个 hides overloaded virtual functions 警告,实际上这里是有意的,即我不需要 Base2::func(float)在派生类中。

我知道通过将 -Wno-overloaded-virtual 附加到编译器标志会使此警告静音,但我不确定这样做是否安全,因为在其他情况下此警告可能有效。

在我的项目中,我有数千个这种情况(即许多具有不同类类型的派生类)。有没有什么好的建议可以让这种情况下不会出现警告,而为其他情况保留警告?

最佳答案

取消隐藏方法的安全方法是使用使用:

class Derived : public Base1, public Base2
{
public:
using Base2::func;
void func(int) override {}
};

按照预期进行以下工作:

Derived d;
d.func(4.2f); // call correctly Base2::func(float) and not Derived::func(int).

为了消除故意隐藏的警告,仍然有编译器特定的方法:

class Derived : public Base1, public Base2
{
public:

#pragma clang diagnostic push
# pragma clang diagnostic ignored "-Woverloaded-virtual"
void func(int) override {}
#pragma clang diagnostic pop
};

然后:

Derived d;
d.func(4.2f); // call Derived::func(int).

关于c++ - 从多个模板化基类派生时出现 "hides overloaded virtual functions"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52515025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com