C++编译器忽略重载的构造函数
C++ compiler ignores overloaded constructor
我的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 的派生类。感谢所有提供帮助的人。
相关文章:
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- 两种类型的构造函数重载
- C++ 构造函数重载 - 为什么说我需要括号?
- C++具有多重继承的构造函数重载解析
- C++,处理多个构造函数重载和冗余代码
- c++ 构造函数重载歧义与initializer_list
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 用户定义的构造函数重载与参数超类的重载不匹配
- 模板专用类之间的构造函数重载
- 指向构造函数重载的指针?
- C++简化了构造函数重载
- 类构造函数重载不起作用
- C++类模板构造函数 -- 重载引用 (U&) 与数组 (U*) 失败
- 为什么存在 C++11 std::initializer_list 构造函数重载规则
- 构造函数重载和默认参数
- 模板类构造函数重载解析
- 单例中的构造函数重载不起作用
- 构造函数重载选择了强制转换运算符而不是结构类型
- c++ 11构造函数重载解析和initialiser_lists: clang++和c++不一致.< / h1 &
- C++构造函数重载的经验法则