farseerfc
9/26/2008 7:49:00 AM
First of all, thank you;
I just simply want the list have access to the private member of the
iterator, many member functions of list(like merge,reverse,etc.) needs this
to change the order of the nodes with no creating/deleting nodes.
Maybe I can write iterator inside list to achieve this (maybe, I haven't
test yet.) And to be frank, this is a part of assignments of my data
structure course, and according to the requirement of the assignment, these
two classes should be apart from each other.
The most interesting thing is the thinking why C++ doesn't supply such kind
of syntax like "partial template friend declaration" . We have already got
template friend ... I try to image that there is some kind of
metaprogramming skill can achieve this goal so I asked it here
;-P
tkank you,and thank you all
"Triple-DES" <DenPlettfrie@gmail.com> wrote
news:c6fdb4b5-c578-4115-8f06-40e651e3e5ab@d70g2000hsc.googlegroups.com...
> On 26 Sep, 08:21, "farseerfc" <farsee...@sjtu.edu.cn> wrote:
>> Hi, everyone here loves C++;
>> As a student studying data structure, I'm writting a single list (with
>> only
>> one pointer to identity the next node in its node struct) simulating
>> std::list like:
>>
>> template <typename T, typename Alloc> class slist {...};
>>
>> Here Alloc accepts a std::allcator . And within the same namespace I
>> wrote
>> its iterator:
>>
>> template <typename T> class slist_iterator {...};
>>
>> the problem is that when I want to say slist is slist_iterator's friend,
>> I
>> can't find a syntax to express exactly what I want, I mean when I write
>> in
>> side slist_iterator:
>>
>> //inside slist_iterator
>> template <typename Ty,typename Alloc> friend class slist;
>>
>> all kinds of slists is the friend of slist_iterator now, ie,
>> slist<double,std::allocator<double> > is also a friend of
>> slist_iterator<int> , that is not what I want.And I can not write this:
>>
>> friend class slist<T,Alloc>;
>>
>> because inside slist_iterator there is no information about Alloc.
>> What I want is a partial template friend declaration, something like a
>> partial template specialization:
>>
>> template<typename Alloc> friend class slist<T,Alloc>;
>>
>> that means all slist with the same element type is the friend of
>> slist_iterator, but no more further.
>> But in all compilers I tested, the sentence above is a syntax error.
>> So can I / howto write this , is there any syntax support or
>> metaprogramming tech to achieve this ?
>
> First of all, why do you need class slist to be a friend of
> slist_iterator?
> Are you sure you don't want it the other way around? (let the iterator
> access the list's private members)
>
> Because that would be pretty simple:
> template<typename T, typename Alloc> class slist
> {
> friend class slist_iterator<T>;
> // ...
> };
>
> DP
>