pag...@gmail.com wrote:
Hello,
I'm having some difficulty compiling template classes as containers for
other template objects. Specifically, I have a hierarchy of template
classes that contain each other. Template class B has an instance of
template class A, which has some base type T (usually int or double).
However, the base type T is important to calculations in B, so I would
like to obtain access to the type for further variable declaration
within B. Below is a simplified version of my best attempt at the
syntax. I'm compiling under XCode 2.0 on Mac OS X version 10.4.6 using
GCC 4. Error messages have been commented in after lines in which they
occur:
//=========================================
#include <iostream>
#include <vector>
template <typename T> class A
{
typedef T base_type;
public:
base_type get_item(int index)
{
return data_(index);
}
private:
std::vector<base_type> data_;
};
template <template <typename T> class A> class B
{
typedef T base_type; // error: 'T' does not name a type
typedef A<base_type> Atype; // error: 'base_type' was not declared
in this scope
public:
base_type get_item(int index)
{
return data_.get_item(index);
}
private:
Atype data_;
};
//=========================================
Is there any way to gain access to these nested template parameters
from within class B? Is there a better way to get this same
functionality without intimate knowledge of A's types? Am I just
making some syntax error in the template class declaration?
Thanks for the help!
The template parameter T that you have defined in the template class B
is really a template parameter for the template template parameter A.
It isnt visible outside. In many ways it is just a holder when
declaring a template template parameter and infact if you dont refer to
it again, you dont even need to have a name for that.
anyway try this.
template <typename T> class A
{
typedef T base_type;
public:
base_type get_item(int index)
{
return data_(index);
}
private:
std::vector<base_type> data_;
};
template < typename T, template <typename> class A> class B
{
typedef T base_type; // error: 'T' does not name a type
typedef A<base_type> Atype; // error: 'base_type' was not
declared in this scope
public:
base_type get_item(int index)
{
return data_.get_item(index);
}
private:
Atype data_;
};
Or...