Re: Problem with frien template class
Tamas <t@v.com> wrote:
Please help me find the problem with the code below. It is working
until I try to set the friendship between RingElem and Ring. I get
the following error message in VC2008:
Error 1 error C3200: 'RingElem<T,u>' : invalid template argument for
template parameter 'RE', expected a class template
template <typename T, int u, template <typename, int> class RE> class
Ring;
template <typename T, int u = 0>
class RingElem
{
friend Ring <T, u, RingElem>; // error C3200
protected:
T* __next;
};
The problem is that, inside the definition of RingElem, the identifier
'RingElem' refers to a particular instantiation RingElem<T, u> of the
template, not the template as a whole. This allows you to write, for
example,
template <typename T, int u = 0>
class RingElem
{
void f() {
RingElem r; // same as RingElem<T, u> r;
}
};
But RingElem<T, u>, being a class and not a template, can't be used as
an argument for template template parameter.
I don't see any way out of this quandary, short of declaring all
instantiations of Ring to be friends of RingElem:
template <typename T, int u = 0>
class RingElem
{
template <typename U, int v, template <typename, int> class RE>
friend class Ring;
};
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925