Re: problems with friend class in templates
- From: "Carl Daniel [VC++ MVP]" <cpdaniel_remove_this_and_nospam@xxxxxxxxxxxxxxx>
- Date: Fri, 20 May 2005 23:13:43 -0700
Joe Carner via .NET 247 wrote:
> 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 {
Is this class a template? Is it nested in one of the classes above?
> 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;
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.
> 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.
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
.
- References:
- problems with friend class in templates
- From: Joe Carner via . NET 247
- problems with friend class in templates
- Prev by Date: Re: Intercept some port
- Next by Date: RE: how do I organize my C++/CLI solution
- Previous by thread: problems with friend class in templates
- Index(es):
Relevant Pages
|