5

编辑 - 将问题更多地放在上下文中。

鉴于:

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)) { }

这没用。aconst_cast对我来说没有意义,因为我不想改变常量,而且我没有改变我所指的内容,那么为什么 g++ 会告诉我

invalid static_cast from type ‘Derived* const’ to type ‘Base* const’

? 如果我省略演员表,它会说

no matching function for call to ‘Alice::Alice(Derived* const)’

如果有人能对此有所了解,将不胜感激。

4

7 回答 7

6

问题是 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,但我没有意识到它是相关的,并且它被隐藏了几个标题,这会让我在这里发布太多代码。对不起大家,但我希望这至少可以帮助以后的其他人。

于 2010-10-16T21:43:54.010 回答
1

你根本不需要任何演员表。您有 const 指针,而不是指向 const 对象的指针。并且在没有强制转换的情况下将派生对象的地址分配给指向基址的指针是合法的。

于 2010-10-16T20:46:20.500 回答
1

我有一个理论。如果在推导过程中您不小心忘记指定推导是公开的怎么办?在这种情况下,默认情况下它将是私有的,并且上述转换将无法访问。

你确定你写的

class Derived : ***public*** Base {...}

?
或者,也许你忘记了公开?只是一个理论...

于 2010-10-16T20:57:42.890 回答
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;
}
于 2010-10-16T21:54:22.687 回答
0

您有不相关的类型AliceBase. 将构造函数更改Alice为采用Base*.

顺便说一句,我怀疑你的const展示位置有误。

干杯&hth.,

于 2010-10-16T21:17:30.207 回答
0

这里唯一的问题是它Alice::Alice是私有的AliceBob无权访问Alice::Alice.

演员阵容没有任何问题。事实上,你不需要static_cast它。它应该被隐式转换。

您当前拥有的static_cast是有效的,除了const目标类型中的冗余限定符。那const根本没有意义,但这不是错误。

我不清楚为什么您的编译器会发出这些奇怪的错误消息。我怀疑您发布的代码是假的。

于 2010-10-16T21:59:09.147 回答
0

虽然我不确定(上下文太少),但我认为您可能指的是Base const *Derived const *

Base const *是一个指向常量 Base 对象的指针。Base * const是一个指向可修改 Base 对象的常量指针。

于 2010-10-17T15:38:11.390 回答