Declaring Template Classes that take Multiple Nested Templates as Parameters

P

pagekb

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!
 
A

amparikh

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_;
};
 
M

mlimber

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...

template <typename T> class A
{
public:
typedef T base_type; // now public

base_type get_item(int index)
{
return data_(index);
}
private:
std::vector<base_type> data_;
};

template <class A> class B
{
typedef typename A::base_type base_type;

public:
base_type get_item(int index)
{
return data_.get_item(index);
}
private:
A data_;
};

Cheers! --M
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,581
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top