スマートポインタで共変量戻り値を使用するには?
質問
このようなコードを持っています。
class RetInterface {...}
class Ret1: public RetInterface {...}
class AInterface
{
public:
virtual boost::shared_ptr<RetInterface> get_r() const = 0;
...
};
class A1: public AInterface
{
public:
boost::shared_ptr<Ret1> get_r() const {...}
...
};
このコードはコンパイルできません。
ビジュアルスタジオでは、次のように表示されます。
C2555: 仮想関数の戻り値の型をオーバーライドすると、戻り値の型が異なり covariant
もし私が
boost::shared_ptr
を使わずに生のポインターを返すと、コードはコンパイルされます (これは
共変量戻り値型
によるものだと理解しています)。私は、この問題が
boost::shared_ptr
の
Ret1
から派生したものではありません。
boost::shared_ptr
の
RetInterface
. しかし、私は
boost::shared_ptr
の
Ret1
を他のクラスで使用するために、そうでなければ、私はリターンの後に返された値をキャストする必要があります。
- 私は何か間違ったことをしているのでしょうか?
- もしそうでないなら、なぜこのような言語になっているのでしょうか。このシナリオでスマートポインタ間の変換を処理するために拡張可能であるべきなのでしょうか。望ましい回避策はありますか?
どのように解決するのですか?
まず、これはC++で実際に動作する方法です。派生クラスにおける仮想関数の戻り値の型は、ベースクラスと同じでなければなりません。あるクラス X への参照/ポインタを返す関数を、X から派生したクラスへの参照/ポインタを返す関数でオーバーライドできるという特別な例外がありますが、ご指摘のとおり、これでは
スマート
ポインタのような
shared_ptr
のような)、単なるポインタのためです。
もしあなたのインターフェイスが
RetInterface
が十分に包括的であれば、呼び出し側のコードで実際に返される型を知る必要はないでしょう。一般に、それはいずれにせよ意味をなしません。
get_r
が
virtual
へのポインタや参照を通して呼び出すことになるからです。
AInterface
この場合、派生クラスがどのような型を返すか知ることはできません。もし、これを実際の
A1
の参照でこれを呼び出す場合は、単に別の
get_r1
の中に
A1
という関数があり、これが必要なことを行ってくれます。
class A1: public AInterface
{
public:
boost::shared_ptr<RetInterface> get_r() const
{
return get_r1();
}
boost::shared_ptr<Ret1> get_r1() const {...}
...
};
あるいは、ビジターパターンや、私の ダイナミック・ダブル・ディスパッチ テクニックを使って、返されたオブジェクトにコールバックを渡し、正しい型を使ってコールバックを呼び出すこともできます。
関連
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】c++でstd::vectorを返すための効率的な方法
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜC++のライブラリやフレームワークではスマートポインタが使われないのですか?
-
[解決済み] shared_ptrとraw pointersはいつ使うのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み] 警告:暗黙の定数変換でのオーバーフロー