lk@MCC.COM (Larry Ketcham) (01/30/91)
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-----------------------