c++ - 解决 clang-12 过载虚拟警告

标签 c++ clang++

下面的代码给出了 clang-12 警告:

warning: 'foo::TIFFFormat::encodePixels' hides overloaded virtual function [-Woverloaded-virtual]

我该如何解决此警告所描述的问题?

namespace foo {

struct bar {
    int k;
};

class IImageFormat
{
  public:
    virtual ~IImageFormat() = default;
    virtual bool encodePixels(void) = 0;
    virtual bool encodePixels(bar pixels) = 0;
};



class ImageFormat : public IImageFormat
{
  public:
    bool encodePixels(bar pixels) override;

};


bool ImageFormat::encodePixels(bar pixels){
    (void)pixels;
    return false;
}


class TIFFFormat : public ImageFormat
{
  public:
    bool encodePixels() override;
};

bool TIFFFormat::encodePixels(){
    return false;
}

}


foo::TIFFFormat tf;

最佳答案

在派生类中声明两个重载之一,而不声明另一个重载,将导致从派生类进行名称查找时仅查找在派生类中声明的重载。

因此,使用您的代码,您将无法调用例如tf.encodePixels(foo::bar{})

如果您不想在派生类中重复所有重载,可以通过 TIFFFormat 中的 using 声明导入所有重载:

using ImageFormat::encodePixels;

如果您不关心或不希望从派生类无法访问重载,则该警告与您无关。

关于c++ - 解决 clang-12 过载虚拟警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71309239/

相关文章:

c++ - 为什么这个程序在 Clang 或 GCC 下不能正常运行?

c++ - 模板化运算符重载决议,成员函数与非成员函数

c++ - 这个析构函数在 C++ 中有效吗?

c++ - 创建具有可移动节点的有向图(使用 QT/Boost)

c++ - 为什么std::is_invocable <std::decay_t <void(int&)>,std::decay_t <int >>::value为假?

c++ - 使用自定义 Clang + Libc++(而不是 stdlibc++)编译 Tensorflow

c++ - 覆盖 new/delete 时,ASAN 无法正确拦截 std::ostringstream 的 str 中的 alloc/free?

c++ - 在 OSX 上构建巨大的 C++ 源代码时出现 LLVM Clang 6.0 fatal error

c# - Serial port write究竟是如何从缓冲区写入数据的呢?

c++ - 是否有一种模式可以依次执行多个 throw 函数?