Re: Templates & automatic type conversion
On Jun 10, 11:21 am, Szabolcs <szhor...@gmail.com> wrote:
Consider the attached example. When I try to compile it (with g++
4.1.2), I get the error message
error: no matching function for call to 'fun(A<int>&)'
However, if I do not use templates, it compiles without errors.
Could someone please explain why this happens?
------------->8---------------
// With A and B templates
template<typename T>
struct B { };
template<typename T>
struct A {
operator B<T> () { return B<T>(); }
};
template<typename T>
void fun(B<T> b) { }
int main() {
A<int> a;
fun(a);
Here, there is no function fun, only a function template. The
compiler procedes by trying to do type resolution on the
template. It needs a function with a signature "fun(A<int>)";
it can get by with "fun(A<int>&)", or "fun(A<int> const&)", but
that's about it. So type deduction fails, the function overload
set is empty, and overload resolution complains that it cannot
find a match.
return 0;
}
------------->8---------------
// Without templates
struct B { };
struct A {
operator B() { return B(); }
};
void fun(B b) { }
int main() {
A a;
fun(a);
Here, the compiler has a function, "fun(B)", to add to the
overload set, without any need to do type deduction or
instantiate a template. Since it is the only function in the
overload set (and it can be called), it is the unique best
match.
return 0;
}
Is there a workaround?
You've found it: don't use templates:-).
Seriously, if you want complex, user defined conversions to be
considered, you might try offering a second template:
template< typename T >
void
fun( B< T > b )
{
fun( static_cast< A< T > >( b ) ;
}
--
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