Ambiguous Template, Code Warrior

The following code compiles in Visual C ++ and gcc, but does not work with Code Warrior

The complaint is that the template call is ambiguous - no decision can be made between doIt (M *) and doIt (M const *), although in each case the parameter is definitely or not const. Annoyingly, if I put the second argument to the template, it decides that it is no longer ambiguous.

template< typename T1, typename T2 > T1 const* doIt( T2 const* ); template< typename T1, typename T2 > T1* doIt( T2* ); class M {}; class N : public M {}; void f() { M* m1 = NULL; M const* m2 = NULL; doIt<N>( m1 ); // Fail doIt<N>( m2 ); // Fail doIt<N,M>( m1 ); // OK doIt<N,M>( m2 ); // OK } 

Is this just a bug with the Code Warrior compiler? (Or a bug with gcc / Visual C ++).

+4
source share
1 answer

This is a bug with the codewarrior compiler.

Here's what you should get:

 template< typename T1, typename T2 > T1 const* doIt( T2 const* ); // 1 template< typename T1, typename T2 > T1* doIt( T2* ); // 2 class M {}; class N : public M {}; void f() { M* m1 = 0; M const* m2 = 0; doIt<N>( m1 ); // In the above call - the compiler does the following (post argument deduction) // 1) create a viable set of functions { N* doIt1<N,M>(const M*) , N* doIt2<N, M>(M*) } // 2) check the conversion sequences - M* -> M* is better than M* -> const M* // Since doIt2 has a "better" conversion sequence (hard to beat identity) it wins - no ambiguity doIt<N>( m2 ); // 1) Viable functions: { doIt1<N,M>(const M*), doIt2<N,const M>(const M*) } // 2) Conversion Sequence Ranking: both do identity - so both are good // 3) Check to see if the "mother" template of either candidate is more specialized // - Since doIt1 theoretically matches fewer types than doIt2, it is unambiguously more specialized (the standard specifies an algorithm to check this) // - so doIt1 wins } 

Hope this helps.

+5
source

All Articles