C++编译器忽略重载的构造函数

C++ compiler ignores overloaded constructor

本文关键字:构造函数 重载 编译器 C++      更新时间:2023-10-16

我的Qt类有两个构造函数:

explicit ConVar(const QString &name, const QString &def, 
                NGlobalCmd::VarCallback callback = NULL, 
                const QString &desc = "", 
                NGlobalCmd::CMDFLAGS flags = 0, 
                bool hasMin = false, float min = 0.0, 
                bool hasMax = false, float max = 0.0, 
                QObject *parent = 0);
explicit ConVar(const QString &name, const QString &def, 
                /* This is the new line */
                CommandManager* manager, ListedConsoleCommand** list,
                NGlobalCmd::VarCallback callback = NULL, 
                const QString &desc = "",
                NGlobalCmd::CMDFLAGS flags = 0, bool hasMin = false, 
                float min = 0.0f, bool hasMax = false, 
                float max = 0.0f, QObject* parent = 0);

但是,当我尝试使用适合第二个构造函数的参数创建类的实例时,我收到一个错误,指出 CommandManager 指针无法转换为回调指针(即编译器不尝试使用第二个构造函数)。有什么理由会发生这种情况吗?奇怪的是,我创建的引用此类库的测试Qt项目没有遇到相同的错误,而我的实际应用程序项目(引用相同的库)却遇到了同样的错误。

<小时 />

编辑

在其中定义类的头文件:

static const QString compileDate(__DATE__);
static const QString compileTime(__TIME__);
static ConVar g_compile_version("g_compile_version",
                                compileDate + " " + compileTime,
                                g_pCommandManager,
                                &g_pCommandList,
                                NULL,
                                "Date and time of last compile.",
                                NGlobalCmd::CMDFLAG_READONLY);

错误:

ConVar::ConVar(const QString &, const QString &,
               NGlobalCmd::VarCallback, const QString &, 
               NGlobalCmd::CMDFLAGS, bool, float, bool, 
               float, QObject*): 
cannot convert parameter 3 from 'ListedCommandManager *' 
                             to 'NGlobalCmd::VarCallback' 
- There is no context in which this conversion is possible.

ListedCommandManager 是 CommandManager 的派生类。

<小时 />

编辑

进一步缩小了问题范围。如果包含 ListedCommandManager 标头,则编译成功,但我不太确定为什么。

/**
 * @brief Extends the CommandManager class by providing functionality to
 * traverse a list of ListedConsoleCommands when the
 * manager is created.
 */
class ICONSOLESHARED_EXPORT ListedCommandManager : public CommandManager
{
public:
    /**
     * @brief Constructor.
     * @param parent QObject parent, if applicable.
     */
    explicit ListedCommandManager(QObject* parent = 0);
    /**
     * @brief Constructor with a pointer to a list to traverse.
     * @param listHead When constructed, the manager will traverse the list
     * whose head is pointed to by this parameter.
     * @param parent QObject parent, if applicable.
     */
    explicit ListedCommandManager(ListedConsoleCommand* listHead,
                                  QObject* parent = 0);
    /**
     * @brief Destructor.
     */
    virtual ~ListedCommandManager() {}
    /**
     * @brief Traverse the list specified by the head and register each
     * console command to the manager.
     * @param listHead Head element of the list of ListedConsoleCommand
     * objects.
     */
    void traverse(ListedConsoleCommand* listHead);
};

解决了 - 我尝试在构造函数中使用的全局命令管理器是在我包含的头文件中定义的,但 ListedCommandManager 只是向前声明的,因此不包括 ListedCommandManager.h 编译器不知道它是来自 CommandManager 的派生类。感谢所有提供帮助的人。