Re: legal code?
On Dec 10, 7:24 pm, Noah Roberts <u...@example.net> wrote:
Someone in another list posted this code. It compiles in G++
and apparently is absorbed by comeau as well. VS vomits.
#include <cstddef>
template < typename T, std :: size_t sz >
struct Block
{
typedef T type[ sz ][ sz ];
};
template < typename T >
void assign( T & assignee, const T & value )
{}
template < typename T, std :: size_t sz >
void assign( T ( & assignee )[ sz ], const T ( & value )[ sz ] )
{}
int main( )
{
Block< int, 16 > :: type a;
const Block< int, 16 > :: type b = { };
assign( a, b );
}
1>e:\dev_workspace\experimental\boost_msg_test\boost_msg_test\boost_msg_t=
est.cpp(22)
: error C2782: 'void assign(T (&)[sz],const T (&)[sz])' : template
parameter 'T' is ambiguous
1>
e:\dev_workspace\experimental\boost_msg_test\boost_msg_test\boost_msg_tes=
t.cpp(14)
: see declaration of 'assign'
1> could be 'const int [16]'
1> or 'int [16]'
1>e:\dev_workspace\experimental\boost_msg_test\boost_msg_test\boost_msg_t=
est.cpp(22)
: error C2782: 'void assign(T &,const T &)' : template parameter 'T' is
ambiguous
1>
e:\dev_workspace\experimental\boost_msg_test\boost_msg_test\boost_msg_tes=
t.cpp(10)
: see declaration of 'assign'
1> could be 'const int [16][16]'
1> or 'int [16][16]'
G++ compiles and calls the T[] version.
It's a bug in VC++. Both function templates should be
instantiated (and the error message suggests they are) and
participate in overload resolution, but according to =A714.5.5.2,
the second is clearly more specialized than the first, and
according to =A713.3.3, if all other things are equal (and they
are, or at least they should be), the function instantiated from
the more specialized template is chosen.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34