Boost logo

Boost :

From: Graeme Prentice (gp.kiwi_at_[hidden])
Date: 2005-09-24 21:40:51


> -----Original Message-----
> From: boost-bounces_at_[hidden]
> [mailto:boost-bounces_at_[hidden]] On Behalf Of Jason Hise
> Sent: Sunday, 25 September 2005 2:11 p.m.
> To: boost_at_[hidden]
> Subject: [boost] call_traits
>
>
> Why doesn't the following compile? I get the error "foo:
> function does
> not take 1 arguments" on VC8.
>
> #include <boost/call_traits.hpp>
>
> template < typename P1 >
> void foo ( typename ::boost::call_traits < P1 >::param_type p1 )
> {
> }
>
> int main ( )
> {
> foo ( 42 ); // error here
> return 0;
> }

This is the infamous non-deduced context. A nested name specifier
(call_traits) is a non-deduced context so P1 cannot be deduced. You have to
write foo<int>(42). This is like an invisible cast, so you have to remember
to change all the explicit type specifiers if you change the type of an
argument being passed in such a function.

>
> (Background info: I would like to use this technique to generate
> optimized forwarding functions that do not know anything about the
> function being forwarded to. Overloads taking any number of params
> would be generated with the boost preprocessor library.)
>
> -Jason

It might be better to write specializations for foo rather than specify the
types at the point of call.

Graeme


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk