What's the correct syntax for a friend with template parameters?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Andy Champ

    What's the correct syntax for a friend with template parameters?

    We have a class with something that, simplified, looks like this:

    template <typename Tclass foo
    {
    T beyondAllReachi ng;

    // In VC2005, this works OK
    template <typename Ufriend void method(foo<Tl, foo<Ur);

    // But VC2008 requires this
    template <typename U, class Vfriend void method(U l, V r);
    };

    // To allow the actual function to access the private data.
    template <typename T, typename Uvoid method(foo<Tl, foo<Ur)
    {
    l.beyondAllReac hing = r.beyondAllReac hing;
    }

    It occurs to me writing this that method<int, charis not a friend of
    foo<char- so I'm a bit surprised that either works. But that isn't
    the main point. I want to know:

    - Which is the correct syntax?
    - Is there a way to stop a method<string, stringaccessing the privates
    of a foo<char>?

    Thanks

    Andy
  • Victor Bazarov

    #2
    Re: What's the correct syntax for a friend with template parameters?

    Andy Champ wrote:
    We have a class with something that, simplified, looks like this:
    >
    template <typename Tclass foo
    {
    T beyondAllReachi ng;
    >
    // In VC2005, this works OK
    template <typename Ufriend void method(foo<Tl, foo<Ur);
    >
    // But VC2008 requires this
    template <typename U, class Vfriend void method(U l, V r);
    };
    >
    // To allow the actual function to access the private data.
    template <typename T, typename Uvoid method(foo<Tl, foo<Ur)
    This is a function template with 2 template arguments. Shouldn't the
    'friend' declaration also have 2 template arguments? That's the reason
    for the correct syntax (you marked it as VC2008).
    {
    l.beyondAllReac hing = r.beyondAllReac hing;
    }
    >
    It occurs to me writing this that method<int, charis not a friend of
    foo<char- so I'm a bit surprised that either works.
    Actually, that's not true, the friend declaration declares *any*
    instantiation of 'method' function template to be a friend of *any*
    'foo' class template instantiation.
    But that isn't
    the main point. I want to know:
    >
    - Which is the correct syntax?
    To declare what, exactly?
    - Is there a way to stop a method<string, stringaccessing the privates
    of a foo<char>?
    'fraid not. Partial specialisations aren't allowed in friend
    declarations. Also, there are no partial specialisations of function
    templates.

    template<class Tclass foo;
    template<class A, class Bvoid method(foo<A>, foo<B>);

    template<typena me Tclass foo
    {
    T beyondAllReachi ng;
    template<class S, class Ufriend void method(foo<Sl, foo<Ur);
    };

    template<class A, class Bvoid method(foo<Afa, foo<Bfb)
    {
    fa.beyondAllRea ching = 0;
    fb.beyondAllRea ching = 0;

    foo<doublefd;
    fd.beyondAllRea ching = 3.14159; // oops. Didn't want that...
    }

    int main()
    {
    foo<intfi;
    foo<charfc;

    method(fi, fc);
    }


    V
    --
    Please remove capital 'A's when replying by e-mail
    I do not respond to top-posted replies, please don't ask

    Comment

    • Andy Champ

      #3
      Re: What's the correct syntax for a friend with template parameters?

      Victor Bazarov wrote:
      >
      Actually, that's not true, the friend declaration declares *any*
      instantiation of 'method' function template to be a friend of *any*
      'foo' class template instantiation.
      >
      Ah. That's not *quite* what I wanted, but that's the language so...

      Thanks

      Andy

      Comment

      Working...