
On 03/21/2004 04:48 PM, Paul Mensonides wrote: [snip]
The Boost pp-lib cannot do the delay required to make this work properly. However, there are other methods of overloading an interface. Will something like this work instead? [proposed code snipped] Regards, Paul Mensonides Yes! Thanks very much. With source: <-----------------cut here----------------------------- using namespace boost::mpl; struct target { target ( int ) { std::cout<<"target(int)\n"; }
target ( int , float ) { std::cout<<"target(int,float)\n"; } target ( int , float , target const& ) { std::cout<<"target(int,float,target const&)\n"; } target ( target const& ) { std::cout<<"target(target const&)\n"; } }; struct member_target { BOOST_PP_REPEAT( 2, PP_CTOR_FORWARDER_OVERLOAD, (member_target)(my_target) ) target my_target; }; struct super_auto_ptr_target : public std::auto_ptr<target> { BOOST_PP_REPEAT( 2, PP_CTOR_FORWARDER_OVERLOAD, (super_auto_ptr_target)(new target)(std::auto_ptr<target>) ) }; int main(void) { typedef vector<int,float> int_float_typelist; at_c<int_float_typelist,0l>::type i=0; ++i; std::cout<<"mt0\n"; member_target mt0(int_float_typelist(),0); std::cout<<"mt1\n"; member_target mt1(int_float_typelist(),0,2.5); std::cout<<"sapt0\n"; super_auto_ptr_target sapt0(int_float_typelist(),0); std::cout<<"sapt1\n"; super_auto_ptr_target sapt1(int_float_typelist(),0,2.5); return 0; }
-----------------------cut here--------------------------------- intel gets output:
/opt/intel_cc_80/bin/icc -g -o pp_ctor_forwarder.exe pp_ctor_forwarder.o running pp_ctor_forwarder ./pp_ctor_forwarder.exe mt0 target(int) mt1 target(int,float) sapt0 target(int) sapt1 target(int,float) however, g++ complains: /usr/local/gcc-3.4-20040225/bin/g++ -ggdb -c -Wall -MMD -O0 -ggdb -I/home/evansl/prog_dev/boost-root.ln/boost_dev -I/home/evansl/prog_dev/boost-root.ln -o pp_ctor_forwarder.o pp_ctor_forwarder.cpp pp_ctor_forwarder.cpp:49: error: `struct boost::mpl::at_c<VecOfTypes, 0l>::type' is not a type pp_ctor_forwarder.cpp:49: error: ISO C++ forbids declaration of `a0' with no type pp_ctor_forwarder.cpp:49: error: `struct boost::mpl::at_c<VecOfTypes, 0l>::type' is not a type pp_ctor_forwarder.cpp:49: error: `struct boost::mpl::at_c<VecOfTypes, 1l>::type' is not a type pp_ctor_forwarder.cpp:49: error: ISO C++ forbids declaration of `a0' with no type pp_ctor_forwarder.cpp:49: error: ISO C++ forbids declaration of `a1' with no type pp_ctor_forwarder.cpp:63: error: `struct boost::mpl::at_c<VecOfTypes, 0l>::type' is not a type pp_ctor_forwarder.cpp:63: error: ISO C++ forbids declaration of `a0' with no type pp_ctor_forwarder.cpp:63: error: `struct boost::mpl::at_c<VecOfTypes, 0l>::type' is not a type pp_ctor_forwarder.cpp:63: error: `struct boost::mpl::at_c<VecOfTypes, 1l>::type' is not a type pp_ctor_forwarder.cpp:63: error: ISO C++ forbids declaration of `a0' with no type pp_ctor_forwarder.cpp:63: error: ISO C++ forbids declaration of `a1' with no type pp_ctor_forwarder.cpp: In function `int main()': pp_ctor_forwarder.cpp:80: warning: passing `double' for converting 3 of `member_target::member_target(const VecOfTypes&, int, int) [with VecOfTypes = main()::int_float_typelist]' pp_ctor_forwarder.cpp:84: warning: passing `double' for converting 3 of `super_auto_ptr_target::super_auto_ptr_target(const VecOfTypes&, int, int) [with VecOfTypes = main()::int_float_typelist]' make: *** [pp_ctor_forwarder.o] Error 1 Again, thanks very much!