编辑 - 将问题放入上下文中。
假设:
struct Base
{
...
};
struct Derived : public Base
{
...
};
class Alice
{
Alice(Base *const _a);
...
};
class Bob : public Alice
{
Bob(Derived *const _a);
...
};
当我尝试实施
时Bob::Bob(Derived *const _d) : Alice(static_cast<Base*const>(_d)) { }
它不起作用。 a const_cast
对我来说没有意义,因为我不想改变常量,而且我没有改变我指向的东西,那么为什么g ++会告诉我
invalid static_cast from type ‘Derived* const’ to type ‘Base* const’
?如果我遗漏演员,那就说
no matching function for call to ‘Alice::Alice(Derived* const)’
如果有人能对此有所了解,我们将不胜感激。
答案 0 :(得分:5)
问题是Derived是一个不完整的类型,即前向声明。我担心我一直在给每个人一个艰难的时刻:( 当Kiril Kirow提议使用动态强制转换时,答案突然出现,g ++在这个问题上吐出了更有用的错误:
error: cannot dynamic_cast ‘_d’ (of type ‘struct Derived* const’) to type ‘struct Base* const’ (source is a pointer to incomplete type)
不幸的是,我已经向前宣布了Derived,但是我没有意识到它是相关的,并且它隐藏了几个标题,这会让我在这里张贴太多代码。对不起大家,但我希望这至少可以帮助别人。
答案 1 :(得分:1)
你根本不需要任何演员表。你有const指针,而不是const对象的指针。将派生对象的地址分配给没有强制转换的指针到基础是合法的。
答案 2 :(得分:1)
我有一个理论。如果在推导期间您意外忘记指定派生是公开的,该怎么办?在这种情况下,默认情况下它将是私有的,并且上述转换将无法访问。
你确定你写过
class Derived : ***public*** Base {...}
?
或许你忘了公开?只是一个理论......
答案 3 :(得分:1)
这完全适用于g ++ 4.4.3,甚至没有警告:
#include <iostream>
struct Base
{
Base()
{
}
};
struct Derived : public Base
{
Derived() {}
};
class Alice
{
public:
Alice( Base *const _a )
{
std::cout << "Alice::Alice" << std::endl;
}
};
class Bob : public Alice
{
public:
Bob(Derived *const _a)
: Alice( static_cast< Base * const >( _a ) )
{
std::cout << "Bob::Bob" << std::endl;
}
};
int main()
{
Derived* pDer = new Derived();
Bob b( pDer );
return 0;
}
答案 4 :(得分:0)
您有不相关的类型Alice
和Base
。更改Alice
构造函数以获取Base*
。
顺便说一句,我怀疑您的const
展示位置错误。
干杯&amp;第h。,
答案 5 :(得分:0)
此处唯一的问题是Alice::Alice
在Alice
中是私有的。 Bob
无法访问Alice::Alice
。
演员阵容无任何问题。实际上,您不需要static_cast
。它应该被隐式转换。
您目前拥有的static_cast
有效,但目标类型中的冗余const
限定符除外。那const
根本没有意义,但这不是错误。
为什么你的编译器发出这些奇怪的错误信息对我来说并不清楚。我怀疑你发布的代码是假的。
答案 6 :(得分:0)
虽然我不确定(上下文太少)但我认为你可能意味着 Base const * 和 Derived const * 。
Base const * 是指向常量Base对象的指针。 Base * const 是一个指向可修改Base对象的常量指针。