キャスト派生*constからbase*const
-
08-10-2019 - |
質問
編集 - 質問をもう少し文脈に入れます。
与えられた:
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)’
誰かがこれに光を当てることができれば、それは大いに感謝されるでしょう。
解決
問題は、導き出されたものが不完全なタイプであり、つまりフォワードが宣言されたことでした。私は皆に苦労してきたのではないかと心配しています:( Kiril Kirowがダイナミックキャストを使用して提案したときに答えが浮かび上がりました。
error: cannot dynamic_cast ‘_d’ (of type ‘struct Derived* const’) to type ‘struct Base* const’ (source is a pointer to incomplete type)
残念ながら、私はフォワード宣言を宣言しましたが、それが関連性があることに気づいていませんでした、そしてそれはさらにいくつかのヘッダーを隠していたので、ここにあまりにも多くのコードを投稿しました。みなさん、申し訳ありませんが、これが少なくとも後で他の誰かに役立つことを願っています。
他のヒント
キャストはまったく必要ありません。 constオブジェクトへのポインターではなく、constポインターがあります。そして、派生オブジェクトのアドレスをキャストなしでポインターベースに割り当てることは合法です。
私には理論があります。派生中に、派生が公開されていることを指定するのを誤って忘れていた場合はどうなりますか?この場合、デフォルトではプライベートであり、上記の変換はアクセスできません。
あなたは確かに書いたのですか?
class Derived : ***public*** Base {...}
?
それとも、あなたは公開されたことを忘れていましたか?ただの理論...
これは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;
}
無関係なタイプがあります Alice
と Base
. 。変更 Alice
取るコンストラクター Base*
.
ちなみに、私 容疑者 あなたがあなたを持っていること const
配置が間違っています。
乾杯&hth。、
ここでの唯一の問題はそれです Alice::Alice
プライベートです Alice
. Bob
アクセスできません Alice::Alice
.
キャストに問題はまったくありません。実際、あなたは必要ありません static_cast
それのための。暗黙的に変換する必要があります。
static_cast
現在、冗長性を除いて有効です const
ターゲットタイプの修飾子。それか const
意味がありませんが、エラーではありません。
コンパイラがこれらの奇妙なエラーメッセージを発行している理由は、私にとって明確ではありません。あなたが投稿したコードは偽物だと思います。
私は確信がありませんが(文脈が少なすぎる)、あなたが意味していたかもしれないと思います ベースconst * と 派生const *.
ベースconst * 定数ベースオブジェクトへのポインターです。 ベース * const 変更可能なベースオブジェクトへの一定のポインターです。