【问题标题】:Why does MSVC produce C3668 error when overriding function with correct signature?为什么在使用正确签名覆盖函数时 MSVC 会产生 C3668 错误?
【发布时间】:2019-01-30 01:09:42
【问题描述】:

在尝试编译派生自 QAbstractItemModel 并覆盖 data 函数的代码时出现错误,尽管签名完全匹配。

以下代码对我来说失败了:

#include <QAbstractItemModel>

class A : public QAbstractItemModel 
{
        Q_OBJECT

public:
    A();

    virtual QVariant data(const QModelIndex &index, int role) const override; 
};

出现以下错误:

C3668: 'A::data': method with override specifier 'override' did not override any base class methods

这只是在我使用的 MinGW 编译器工作时使用 MS Visual C++ 14.0 时出现的问题。

编辑:

//  A.cpp

QVariant A::data(const QModelIndex &index, int role) const
{
    Q_UNUSED(index);
    Q_UNUSED(role);

    return QVariant();
}

【问题讨论】:

  • 如果省略 override 会发生什么?编译器会让你创建一个A 对象吗?如果不是,错误信息是什么? (这只是一个实验)
  • 如果我省略 override 那么,是的,它确实有效。
  • 是否使用默认值` = Qt::DisplayRole` 有帮助?
  • 好点,但不幸的是,即使使用默认值也会弹出相同的错误。
  • 在 MSVC 15.8.1 和 Qt 5.10.0 中正常工作...可能原始 Qt 的头文件被错误地编辑了? (Qt的安装对于VC和MinGW应该是不一样的,所以可能问题就出在这里)

标签: c++ qt visual-c++


【解决方案1】:

您提供的方法签名是正确的。由于 VC 和 MinGW 的 Qt 安装不同,问题可能是由于 VC 版本中对 QAbstractItemModel.h 进行了不必要的修改(例如,您正在调试并无意识地编辑了头文件)。

检查标头没有被修改,如果是,请从备份或其他安装(相同版本)中恢复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 2016-01-09
    • 2017-01-29
    • 2014-06-05
    • 2017-05-23
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多