public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: Don Mies <dmies@bluekite.com>
To: gcc-bugs@gcc.gnu.org, bug-gcc@gnu.org, gcc@gcc.gnu.org
Subject: Re: Casting Overloaded Function Pointer Problem...Repost..
Date: Mon, 18 Sep 2000 14:39:00 -0000	[thread overview]
Message-ID: <39C68B58.19D745EB@bluekite.com> (raw)

This is a reposting of an earlier message because I received a request
from one of the list members to post the request without any of the
HTML formatting.

------

Gentlemen,

This is a reposting of an earlier request.  I received no responses
that helped in resolving my problem so I will try posting the query
again...

I have run into a problem trying to use the g++ compiler on a Sun
Solaris 7 system.

I've been trying to compile a version of the Microsoft MFC library
with the g++ compiler and have run into a problem that I don't know
how to resolve.

Here is a highly condensed test file that illustrates the problem.

--------------------------------------------
     1
     2  class CCmdTarget;
     3  class CWnd;
     4  class CRecordView;
     5
     6  typedef int (CCmdTarget::*PMSG)(int);
     7
     8  class CCmdTarget {};
     9
    10
    11  class CWnd : public CCmdTarget
    12  {
    13    public:
    14      int OnMove (int x, int y);
    15  };
    16
    17
    18  class CRecordView : public CWnd
    19  {
    20    public:
    21      int OnMove (int);
    22    protected:
    23      void OnMove (int cx, int cy);
    24    private:
    25      static const PMSG _messageEntries[];
    26  };
    27
    28
    29  ////////////////////////////////////////////////////////////
    30
    31  const PMSG CRecordView::_messageEntries[] =
    32  {
    33      (PMSG)&CRecordView::OnMove
    34  };

  ----------------------------------------

If I compile the above with the Sun CC compiler, I get no complaints
or warnings.  When I compile it with g++ (gcc version 2.95.2 19991024
(release)) I get the following error messages:

@
"xx" 107 lines, 3353 characters 

f % cat xx

Gentlemen, 

This is a reposting of an earlier request.  I received no responses 
that helped in resolving my problem so I will try posting the query 
again... 

I have run into a problem trying to use the g++ compiler on a Sun 
Solaris 7 system. 

I've been trying to compile a version of the Microsoft MFC library 
with the g++ compiler and have run into a problem that I don't know 
how to resolve. 

Here is a highly condensed test file that illustrates the problem. 

-------------------------------------------- 
     1 
     2  class CCmdTarget; 
     3  class CWnd; 
     4  class CRecordView; 
     5 
     6  typedef int (CCmdTarget::*PMSG)(int); 
     7 
     8  class CCmdTarget {}; 
     9 
    10 
    11  class CWnd : public CCmdTarget 
    12  { 
    13    public: 
    14      int OnMove (int x, int y); 
    15  }; 
    16 
    17 
    18  class CRecordView : public CWnd 
    19  { 
    20    public: 
    21      int OnMove (int); 
    22    protected: 
    23      void OnMove (int cx, int cy); 
    24    private: 
    25      static const PMSG _messageEntries[]; 
    26  }; 
    27 
    28 
    29  //////////////////////////////////////////////////////////// 
    30 
    31  const PMSG CRecordView::_messageEntries[] = 
    32  { 
    33      (PMSG)&CRecordView::OnMove 
    34  }; 

  ---------------------------------------- 

If I compile the above with the Sun CC compiler, I get no complaints 
or warnings.  When I compile it with g++ (gcc version 2.95.2 19991024 
(release)) I get the following error messages: 

    t.C:34: no matches converting function `OnMove' to type `int (CCmdTarget::*)(int)' 
    t.C:21: candidates are: int CRecordView::OnMove(int) 
    t.C:23:                 void CRecordView::OnMove(int, int) 

If I comment out the overloaded function declaration at line 23, it will compile 
with no errors. 

The compiler appears to be ignoring the cast operator at line 23 when it determines 
the function signature. 

I received one response to my initial posting with the following information: 

> Your code is essentially asking GCC to convert the pointer 
> to the member function into a p-to-m-f of the base class. 
> If I'm interpreting this correctly, according to the C++ 
> Standard, section 13.4, this is not allowed: 
> 
> [Note: there are no standard conversions (clause 4) of one 
> pointer-to-function type into another. In particular, even 
> if B is a public base of D, we have 
> 
>       D* f(); 
>       B* (*p1)() = &f; // error 
>       void g(D*); 
>       void (*p2)(B*) = &g; // error 
> 
> -end note] 
> 
> Therefore, I think GCC may be right in complaining about 
> this code. 

However, I don't believe the above interpretation is incorrect as 
my example program above is doing an explicit cast and not 
a standard cast as the above response contends.  In addition, 
if I comment out line 23 to remove the overloading function 
declaration, it will compile with no errors and the casting 
operation is still in effect and unchanged. 

Sections 5.1.10.6, 5.2.10.9, and 5.4.5 of the C++ Standard seem 
to indicate that the above construct should be legal but the g++ 
compiler appears to disagree. 

Is there a way to fix this without making major changes to the source files 
(I don't understand  the MFC library well enough to make changes to it)? 

Thank you, 
  

Don Mies

-- 
<i><font size=-2>This e-mail contains information intended only for the
use of the individual or entity named above.&nbsp; If the reader of this
e-mail is not the intended recipient or the employee or agent responsible
for delivering it to the intended recipient, any dissemination, publication
or copy of this e-mail is strictly prohibited.&nbsp; If you have received
this e-mail in error, please immediately notify the sender.
<br>Thank you.</font></i>
begin:vcard 
n:Mies;Don
tel;fax:(714) 375-2737
tel;work:(714) 843-6050
x-mozilla-html:FALSE
url: http://www.bluekite.com
org:BlueKite.com, Inc.;Unix Development
version:2.1
email;internet:dmies@bluekite.com
adr;quoted-printable:;;17011 Beach Blvd, Suite 1230=0D=0A;Huntington Beach;CA;92647;U.S.A.
x-mozilla-cpt:;-24136
fn:Don Mies
end:vcard

             reply	other threads:[~2000-09-18 14:39 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-09-18 14:39 Don Mies [this message]
  -- strict thread matches above, loose matches on Subject: below --
2000-09-18 11:06 Don Mies

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=39C68B58.19D745EB@bluekite.com \
    --to=dmies@bluekite.com \
    --cc=bug-gcc@gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    --cc=gcc@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).