CRTPを使用して静的多型を実装し、テンプレートパラメータに追加の型を追加したいと思います。基本クラスメンバにアクセスする追加のテンプレートパラメータを持つC++静的ポリモーフィズム/ CRTP
以下のシナリオを提供しますが、派生クラスからBaseメンバーに直接アクセスするにはどうすればよいですか?基本クラスの完全な型を指定せずに可能ですか? ++ 3.8.0出力++ 5.3.1 /打ち鳴らす
#include <iostream>
template<class Derived, class X>
struct Base
{
void set_a(int a) { _a = a; }
protected:
int _a;
};
template<class X>
struct Derived: public Base<Derived<X>, X>
{
int get_a()
{
// return Base<Derived<X>,X>::_a; // This works!
return _a; // error: use of undeclared identifier '_a'
}
};
struct foo;
int main()
{
Derived<foo> test;
auto base_p = static_cast< Base<Derived<foo>, foo>* >(&test);
base_p->set_a(42);
int a = test.get_a();
std::cout << a << std::endl;
}
グラム:
error: use of undeclared identifier '_a'
すてきな回避策!しかし、なぜ私はそれを一度指定しなければならないのか理解したいです! – Albert
@Albertベースクラスがクラスのテンプレートパラメータに依存しているため、これを指定する必要があります。 – Holt
今@Holtは本当の問題を発見した、私は関連する質問を見つけた:http://stackoverflow.com/questions/1239908/why-doesnt-a-derived-template-class-have-access-to-a-base-テンプレートクラスID – Albert