我读了
但答案似乎不适用于我的问题。
我通过 Ideone检查了以下编译,因为它应该:
class Base
{
public:
Base() {}
virtual ~Base() {}
};
class Derived : public Base
{
public:
Derived() {}
virtual ~Derived() {}
};
class Manager
{
public:
Manager(Base* b) {}
~Manager() {}
private:
Manager() {}
};
int main()
{
Derived* d = new Derived;
Manager* m = new Manager(d);
return 0;
}
但是,我认为在我的实际程序中是相同的情况,会产生错误(关键字当然已被替换):
"main.cc", line 551: Error: Could not find a match for Manager::Manager(Derived*) needed in main().
我意识到发布显式代码会有所帮助,但是代码的复杂性(不是我编写的,涉及无数层继承,每个文件包含数十个包含,无处不在的朋友类,外部变量等)令人麻木,而且我什至不确定要减少什么(什么是相关的,什么不是)才能获得合理的内容以在此处发布。
我有一个提示可能会有所帮助。我发现预先转换为基类是可行的:
Manager* m = new Manager((Base*)d);
当然,我不应该那样做。但它有效的事实告诉我,我没有犯一些小错误,比如*
在构造函数的签名中忘记 a 。
谁能想到一些可能的原因,我可能会得到我得到的错误,但不是当我将派生实例显式转换为基类时?
我正在使用 Sun Studio 12 Update 1。
额外细节
我不知道为什么这很重要,但在我的实际应用程序中,我正在使用指针指针,例如
...
class Manager
{
public:
Manager(Base** b) {}
~Manager() {}
private:
Manager() {}
};
...
Derived* d = new Derived;
Derived** d_ptr = &d;
Manager* m = new Manager(&d_ptr);
因此,重申一下,当我执行以下操作时,上述方法有效。
Manager* m = new Manager((Base**)(&d));