Connecting Tech Pros Worldwide Forums | Help | Site Map

problems with friend class in templates

Joe Carner via .NET 247
Guest
 
Posts: n/a
#1: Nov 17 '05
First time posting, thanks in advance for any help you can give me.
Basically I am trying to a class that i want to be able to access the private data members of another class, both of which i created.

But, I can't get the friend class to work. For example (this is not actually my code):



template <typename Key, typename Value> class MyMap;
template <typename Key, typename Value> struct MyMapNode;

class MyIterator {
friend class MyMap<Key, Value>;
public:
?
?
?

private:
pair<Key, Value> * pointee;
MyMapNode<Key, Value> * nodee;
MyIterator(pair<Key, Value> *pointee = NULL, MyMapNode<Key, Value> *nodee = NULL) : pointee(pointee), nodee(nodee) {}
};

template <typename Key, typename Value>
class MyMap {
public:
typedef MyIterator<Key, Value> iterator;
typedef MyIterator<Key, Value> const_iterator;
?
};

Given that, the following line doesn?t work in a test file:

#include "TheHeaderFileWithTheStuffIPutAbove.h"
...
MyMap<string, int>::iterator iter;

which is to say, i can't create any instance of iterator because the constructor is private (though it is supposed to be a friend)

i get an error about how the constructor can not be accessed because it is private.

This problem has been plaguing me for a long time. Any help would be appreciated.

-----------------------
Posted by a user from .NET 247 (http://www.dotnet247.com/)

<Id>RaZbhxmDDkyiNriA7sn3vw==</Id>

Carl Daniel [VC++ MVP]
Guest
 
Posts: n/a
#2: Nov 17 '05

re: problems with friend class in templates


Joe Carner via .NET 247 wrote:[color=blue]
> First time posting, thanks in advance for any help you can give me.
> Basically I am trying to a class that i want to be able to access the
> private data members of another class, both of which i created.
>
> But, I can't get the friend class to work. For example (this is not
> actually my code):
>
>
>
> template <typename Key, typename Value> class MyMap;
> template <typename Key, typename Value> struct MyMapNode;
>
> class MyIterator {[/color]

Is this class a template? Is it nested in one of the classes above?
[color=blue]
> friend class MyMap<Key, Value>;
> public:
> ?
> ?
> ?
>
> private:
> pair<Key, Value> * pointee;
> MyMapNode<Key, Value> * nodee;
> MyIterator(pair<Key, Value> *pointee = NULL, MyMapNode<Key, Value>
> *nodee = NULL) : pointee(pointee), nodee(nodee) {} };
>
> template <typename Key, typename Value>
> class MyMap {
> public:
> typedef MyIterator<Key, Value> iterator;
> typedef MyIterator<Key, Value> const_iterator;
> ?
> };
>
> Given that, the following line doesn?t work in a test file:
>
> #include "TheHeaderFileWithTheStuffIPutAbove.h"
> ..
> MyMap<string, int>::iterator iter;[/color]

Where does this declaration appear - is it inside a member function of
MyMap<string,int>? If not, the friend declaration doesn't help you any.
[color=blue]
> which is to say, i can't create any instance of iterator because the
> constructor is private (though it is supposed to be a friend)
>
> i get an error about how the constructor can not be accessed because
> it is private.
>
> This problem has been plaguing me for a long time. Any help would be
> appreciated.[/color]

Hopefully this sample can get you pointed in the right direction. Note that
the map class and the iterator class are friends of each other.

<code>

template <class K, class V> class MapIterator;

template <class K, class V> class MyMap
{
friend class MapIterator<K,V>;

struct MapNode
{
};

MapNode* m_node;

public:
typedef MapIterator<K,V> iterator;

iterator begin();
};

template <class K, class V> class MapIterator
{
public:
MapIterator()
{
}

private:
friend class MyMap<K,V>;
typedef typename MyMap<K,V>::MapNode NodeType;

MapIterator(NodeType* node)
: m_node(node)
{
}

NodeType* m_node;
};

template<class K, class V>
typename MyMap<K,V>::iterator MyMap<K,V>::begin()
{
return iterator(m_node);
}


typedef MyMap<int,float> MIF;

void test()
{
MIF mif;
MIF::iterator it = mif.begin();
MIF::iterator it2;
}

</code>

-cd


Closed Thread