Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #15199

Re: problem with template friend partial specialization

From Victor Bazarov <v.bazarov@comcast.invalid>
Newsgroups comp.lang.c++
Subject Re: problem with template friend partial specialization
Date 2012-04-03 08:52 -0400
Organization A noiseless patient Spider
Message-ID <jlerpn$ctc$1@dont-email.me> (permalink)
References <13976142.1067.1333359344646.JavaMail.geo-discussion-forums@ynel5>

Show all headers | View raw


On 4/2/2012 5:35 AM, Andrey Dj wrote:
> Hello!
>
> I found some interesting case of non-compiling C++ code.
> Look at first example:
>
> --------------------------------
> template<class T>  void Foo(T*);
> class Bar;
> template<>  void Foo(Bar*);
>
> class Bar
> {
>      friend void ::Foo<>(Bar*);
> };
> --------------------------------
>
> Compiling... All fine.
>
> Now add to Foo return type of Baz:
>
> --------------------------------
> class Baz {};
>
> template<class T>  Baz Foo(T*);
> class Bar;
> template<>  Baz Foo(Bar*);
>
> class Bar
> {
>      friend Baz ::Foo<>(Bar*);
> };
> --------------------------------
>
> Trying to compile:
> MSVC: error C2039: 'Foo' : is not a member of 'Baz'
> GCC: error: 'Foo' in class 'Baz' does not name a type
>
> Is there any way to declare such friend partial specialization?

It's a tokenization problem, obviously.  Your compiler treats the colons 
before 'Foo' in the friend declaration as part of an elaborate name 
specifier that starts with 'Baz'.  It knows that 'Baz' is a class name...

You could try adding a 'using' declaration before the 'friend':

     class Bar
     {
        using ::Foo;
        friend Baz Foo<>(Bar*);
     };

(I've not tried it).  Or you could put 'Baz' in parentheses:

     class Bar
     {
        friend (Baz) ::Foo<>(Bar*);
     };

(I've not tried it either).  What you essentially need is tell the 
compiler that the token "Baz" should stand on its own and not be treated 
as the beginning of an elaborate name specifier even though there is a 
name resolution operator after it.

V
-- 
I do not respond to top-posted replies, please don't ask

Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

problem with template friend partial specialization Andrey Dj <djdron@gmail.com> - 2012-04-02 02:35 -0700
  Re: problem with template friend partial specialization Victor Bazarov <v.bazarov@comcast.invalid> - 2012-04-03 08:52 -0400
    Re: problem with template friend partial specialization Kalle Olavi Niemitalo <kon@iki.fi> - 2012-04-04 01:15 +0300
      Re: problem with template friend partial specialization Andrey Dj <djdron@gmail.com> - 2012-04-05 07:09 -0700

csiph-web