申し訳ありませんが重複している場合、このシナリオでは何も見つかりませんでした。これは名前解決の問題自体ではなく、より多くのテンプレート/構造の問題です。クラスを含むクラスから派生したテンプレート引数が基本クラス
template< typename T > struct X;
struct Y {
X<Y> & xy;
Y(X<Y> & _xy) : xy(_xy) {}
virtual ~Y();
};
template< typename T > struct X {
static_assert(std::is_base_of<Y, T>::value, "T is not a Y");
T member_t;
X() : member_t(*this) {}
virtual ~X();
}
struct DY : Y {
int test2 = 2;
void tester1() {
// int t1 = static_cast< X<DY> >(xy).test1;
// fails: no known conversion for argument 1 from 'X<Y>' to 'const X<DY>&'
}
};
struct DX : X<DY> {
int test1 = 1;
void tester2() {
int t2 = member_t.test2; // perfectly ok, no problems.
}
};
完全なエラーリストは、ほとんどが、理にかなってい意地の悪のカスケードである:タイトル毎の
は、次のようになりますような状況があります。私が理解できないのは、tester1
の状況をどのように処理するかです。それは、派生するクラスであり、そのメンバーの1つのテンプレートでそれ自身を使用し、派生クラスはコンパニオンクラスのテンプレート(X- > DX)。彼らは「無関係」クラスです - ここでは
X<Y>
が直接
X<DY>
に変換することはできませんなぜ私は完全に理解し
main.cpp: In instantiation of 'struct X<Y>':
main.cpp:35:44: required from here
main.cpp:23:5: error: static assertion failed: T is not a Y
static_assert(std::is_base_of<Y, T>::value, "T is not a Y");
^
main.cpp: In member function 'void DY::tester1()':
main.cpp:35:44: error: no matching function for call to 'X<DY>::X(X<Y>&)'
int t1 = static_cast< X<DY> >(xy).test1;
^
main.cpp:35:44: note: candidates are:
main.cpp:25:5: note: X<T>::X() [with T = DY]
X()
^
main.cpp:25:5: note: candidate expects 0 arguments, 1 provided
main.cpp:21:31: note: constexpr X<DY>::X(const X<DY>&)
template< typename T > struct X
^
main.cpp:21:31: note: no known conversion for argument 1 from 'X<Y>' to 'const X<DY>&'
(申し訳ありません、事前に私の行番号がここにフォーマットさよりも若干異なります)...あなたの楽しみの人々のためにあります。実際には、Y
が基本クラスのDY
であることがわかっている一般的なケースでこの変換を実行するエレガントな方法はありますか?
現時点では私の推測では、コンパイラのノートの1あたりに、コンストラクタX<DY>::X(X<Y>)
(または類似のオペレータ)を実装することですが、何らかの理由でY
がコピーできない場合はそれができないかもしれません...だからX<DY>::member_y
このようX<Y>::member_y
からコピーする必要がありますか、エレガントに静的にキャストできますか?わからない...
目指す
あり、二つのクラス、X
とY
があり、それらはX
はテンプレート引数としてそのY
またはいくつかの派生物を受け入れるという関係を有しています。これは、たとえば、一部のコンテナX
内のY
のようなオブジェクトに共通する動作を調整することです。
派生したY
とちょうどX
を使用することは(私にとにかく)どのように行うのか自明です。課題は、「調整された行動」自体を拡張可能にすることです。上記のことは、派生したY
タイプのX
タイプを参照する必要がある場合には、明確に機能しない派生型のX
(DX
)を作成する試みです。
YがDYの基底であっても、XとX の間には強制的な関係はありません。上記のように定義しても、理論的にコンパイラは、パディングのためにX :: member_tとX :: member_tを異なるオフセットで格納することができます。 Btw、どうやってDYを構築しますか?あなたのX &受け入れることはありませんX ... –
lorro
ええ、それは問題の笑...私は分かりません。テンプレートパラメータ型の変換/キャストを行う方法はありますか? –