$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
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