#include <memory>
#include <iostream>

using namespace std;

template <class T>
class B 
{
public:
  void outB() { cout << "dim from B is " << dim_ << endl ; }
  B(int dim) : dim_(dim) {}
  ~B() {}
protected:
  int dim_;
};

template <class T>
class A : B<T>
{
public:
  using B<T>::dim_;
//  using B<T>::outB;
  void outA() { cout << "dim from A is " << dim_ << endl ; }
  A(int dim) : B<T>(dim) {}
  ~A() {}
private:
};


int main(int argc, const char *argv[])
{
  shared_ptr<A<double> > ap(new A<double>(2));
  ap->outA();
  ap->outB();
  return 0;
}