🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Larry Ketcham Tue, 29 Jan 1991 21:23
decl order affects ovld match?
#385
Author: Larry Ketcham
Date: Tue, 29 Jan 1991 21:23
86 lines
2929 bytes
On g++ 1.37.2-beta, I've run into a case where declaration order 
determines which variant of an overloaded operator is selected as
a match.  However, this is not what I expected.  According to 
page 319 of the ARM:

	"The effects of overloading are independent of the
	order of function declarations."

In the program below, operator<< is overloaded for the class
local_streams.  Two variants of operator<< are declared:
one for an argument of type int, and one for an argument of
type char.  When operator<< is used with an actual argument
of type short, the compiler will sometimes select the int 
version and sometimes char, depending upon the order of the
overloaded operator declarations.

In the program below, defining the macro BAD will reverse the 
declaration order of the two overloaded functions.  I expect
the short to be promoted to int, but when BAD is defined, the
short is converted to char.  Why?

To get the correct result, compile the program as follows:

	g++ prom.cc -o prom

To make the program fail, compile it as follows:

	g++ prom.cc -o prom -DBAD

Is this a g++ bug?

----------------------------------------------
Larry Ketcham           lk@mcc.com
Experimental Systems
MCC			Austin, Texas


----------------prom.cc-----------------------
#include <stdio.h>
#include <string.h>
#include <builtin.h>
/*
  The compiler converts short to char (instead of promoting short to int),
  if operator<<(int) is declared before operator<<(char).
*/
class local_streams
  {
    char buffer[80];
  public:
#ifdef BAD
    local_streams& local_streams::operator << (int);
    local_streams& local_streams::operator << (char);
#else
    local_streams& local_streams::operator << (char);
    local_streams& local_streams::operator << (int);
#endif
  };

local_streams& local_streams::operator << (char c)
  {
    printf ("local_streams::operator<<(char)\n");
    strcat (buffer, &c);
    return *this;
  }

local_streams& local_streams::operator << (int i)
  {
    printf ("local_streams::operator<<(int)\n");
    strcat (buffer, itoa(i));
    return *this;
  }

main ()
{
  short int num = 88;
  local_streams io;
  io << num;
  printf ("expected output: %s\n", itoa(num));
  printf ("  actual output: %s\n", (char*)&io);
  if (strcmp((char*)&io, itoa(num)))
      printf ("Test FAILED.\n");
  else
      printf ("Test was successful.\n");
}
----------------prom.cc-----------------------
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads