Re: problems with friend class in templates



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


.



Relevant Pages

  • Re: Best way to "redefine" a std class
    ... template <typename T> myList { ... iterator begin ...
    (comp.lang.cpp)
  • Re: Counting how many time a template is accessed
    ... This template has been loaded onto everyone's ... >>>Public Sub AutoExec() ... >>>Private Const mcIncrementSize As Long = 10 ... >>>Private mstrCounterFile As String ...
    (microsoft.public.word.vba.general)
  • Re: Can one save a reference added to project when automating Word
    ... It does appear that if working thru the Word object, a copy of the template ... ' Private Const strReference As String = "MyReference" ... Private blnUseAppWord As Boolean ...
    (microsoft.public.word.vba.general)
  • Count Template Usage
    ... I need to count how many times each template is used. ... Dim strUserName As String, cCounterFileFullPath As String ... Private Const mcIncrementSize As Long = 10 ...
    (microsoft.public.word.vba.general)
  • Re: Coding the ENTER key to move between form fields in a protecte
    ... If you make the code private it won't run and so you won't have any ... I have tried to make sure that the customization would not ... > applied to the Normal.dot template by using the suggestions that Tony gave ...
    (microsoft.public.word.vba.beginners)