GCC-3.1: g++ and default parameters of methods

Oscar Fuentes ofv@wanadoo.es
Sat Jun 15 22:25:00 GMT 2002


Rene Rebe <rene.rebe@gmx.net> writes:

> Hi.
> 
> During converting GSMP to compile with the recent g++ 3.1 we had to
> convert many occurencies of this style:
> 
> xyz.hh:
> void some_func (int p1, int p2 = 666);
> 
> xyz:cc:
> void some_func (int p1, int p2 = 666);
> 
> to xyz.cc:
> void some_func (int p1, int p2);
>                               ^^^^^^^^
> 
> Because g++ emmited (e.g.) the following error message:
> 
> DataLayer.cc:224: default argument given for parameter 4 of `
>    GSML::DataLayer::DataLayer(const std::string&, GSML::DataFileIndex*, 
>    GSML::PCMDatatype*, unsigned int = 44100)'
> ../include/DataLayer.hh:113: after previous specification in `
>    GSML::DataLayer::DataLayer(const std::string&, GSML::DataFileIndex*, 
>    GSML::PCMDatatype*, unsigned int = 44100)'
> make[2]: *** [DataLayer.o] Error 1
> 
> Is this a really enforced by the ANSI C++ Standard and so a feature,
> or a regression?

This is mandated by the standard. See 8.3.6.4:

-- Quote
[...] A default argument shall not be redefined by a later declaration
(not even to the same value).
-- End quote

Just for your amusement:

xxx.cpp
void foo(int x = 10);

foo(); // calls foo(10)

yyy.h
void foo(int x = 0);

foo(); // calls foo(0)

This hints that you should define your default arguments in a header
file and #include it whenever you want to use the function, that is,
never declare the function in a cpp file to save an #include, unless
you like subtle bugs and maintenance nightmares.

-- 
Oscar



More information about the Gcc mailing list