Nagarei / DxLibEx

DXライブラリC++化プロジェクト
Boost Software License 1.0
31 stars 3 forks source link

graph2dがコンパイルエラー #40

Open yumetodo opened 8 years ago

yumetodo commented 8 years ago

Clang with Microsoft CodeGenにて

C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Helper.h(171,4): error : cannot cast private base class 'dxle::impl::Unique_HandledObject_Bace<dxle::graph2d::texture_2d>' to 'dxle::graph2d::texture_2d'
                          static_cast<Child*>(this)->delete_this();
                          ^
  C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Graph2D.h(55,4) :  note: in instantiation of member function 'dxle::impl::Unique_HandledObject_Bace<dxle::graph2d::texture_2d>::~Unique_HandledObject_Bace' requested here
                          texture_2d() : Unique_HandledObject_Bace() {}
                          ^
  C:\Users\yumetodo\Documents\git\DxLibEx\dxlibex/Graph2D.h(52,32) :  note: declared private here
                  class texture_2d /*final*/ : private impl::Unique_HandledObject_Bace<texture_2d>
                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  1 error generated.

VSでは通る模様。

多分 https://github.com/Nagarei/DxLibEx/commit/166f2464948639822aa65f95aa4c818dcbd61a88 この変更が不味いのだろう

2

yumetodo commented 8 years ago

Unique_Handle_Baceクラスですが、これを継承するのではなく、メンバーとして持つほうが見た目にもわかりやすいし、template不要でいいんじゃないかと思うのですがどうでしょう。

Nagarei commented 8 years ago

Unique_Handle_Baceをメンバーとして持つ

言われてみればその通りですね。それで修正します。

Nagarei commented 8 years ago

なんでUnique_Handle_Baceを継承していたか忘れてた...。

  1. DxLibにはハンドルの一般的な削除関数無い為、delete_thisのデフォルト実装を書けない。
  2. そこで、template+サブクラス化+ダウンキャストならオーバーヘッドなしで書ける。

public継承で解決したほうが良いですね...。

Nagarei commented 8 years ago

7ff1515 #40 Unique_HandledObject_Baceをpublic継承するように戻す

コミットメッセージに書き忘れた...。

yumetodo commented 8 years ago

DxLibにはハンドルの一般的な削除関数無い為、delete_thisのデフォルト実装を書けない。

Unique_Handle_Baceのコンストラクタにlambdaを渡すほうが楽じゃないですか?関数ポインタ使わないから多分そのほうが速い気がします (#19 のP0052R0をはよう訳してscope_exist実装せいやという話になってしまいますが。)