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

それは動作しません。const_castconstnessを変更したくないのでaは意味がありません。また、指しているものを変更していないので、なぜ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

ここでの唯一の問題は、Alice::AliceでプライベートであるということですAliceBobにアクセスできませんAlice::Alice

キャストに問題はありません。実際、あなたはそれのためにを必要としませんstatic_cast。暗黙的に変換する必要があります。

ターゲットタイプの冗長修飾子static_castを除いて、現在持っているものは有効です。そこにあることは単に意味がありませんが、それはエラーではありませんconstconst

コンパイラがこれらの奇妙なエラーメッセージを発行する理由は私にはわかりません。あなたが投稿したコードは偽物だと思います。

于 2010-10-16T21:59:09.147 に答える
0

無関係なタイプAliceとがありBaseます。Aliceコンストラクターを変更して、 Base*.

ところで、私はあなたの配置が間違っていると思います。const

乾杯 & hth.,

于 2010-10-16T21:17:30.207 に答える
0

確かではありませんが(コンテキストが少なすぎます)、Base const *およびDerived const * を意味していた可能性があります。

Base const *は定数 Base オブジェクトへのポインタです。Base * constは、変更可能な Base オブジェクトへの定数ポインタです。

于 2010-10-17T15:38:11.390 に答える