From: Russell O. <ro...@uw...> - 2009-11-03 00:57:44
|
On Nov 1, 2009, at 12:59 PM, William S Fulton wrote: > Russell E. Owen wrote: >> (Sorry if this is a duplicate; the first attempt didn't show up >> here). >> I am having some issues with shadowed constructors that I think are >> caused by using std_vector.i >> Some of our classes have multiple constructors such as this: >> Foo::Foo(std::vector<double> &values) >> Foo::Foo(std::vector<boost::shared_ptr<FancyClass> > &fancyClasses) >> and our SWIG file wraps the class Foo and also wraps the arguments >> as so: >> %template(VectorDouble) std::vector<double>; >> %template >> (VectorFancyClass)std::vector<boost::shared_ptr<FancyClass> >; >> SWIG complains that the latter constructor is shadowed by the former. >> As far as I can tell this is because both std::vector<double> and >> std::vector<boost::shared_ptr<some fancyclass> > have been >> templated after including std_vector.i. Thus SWIG is trying to >> support all of the following forms of Foo constructor: >> 1) an explicitly constructed VectorDouble >> 2) a python list of doubles (due to std_vector.i and much >> appreciated) >> 3) an explicitly constructed VectorFancyClass >> 4) a python list of FancyClasses (due to std_vector.i and not >> necessary) >> and the two python list versions (2 and 4) are colliding with each >> other. >> I suspect that both Foo constructors are actually available, and >> that only case (4) is unavailable. If so, we can live with it. But >> I would rather explicitly disable std_vector.i for VectorFancyClass >> if there is some easy way to do this. >> I realize I could just include std_vector.i at the very end, but >> that happens to be a headache due to the way we're including it >> right now (in a common .i file shared by all others -- maybe that >> is a mistake). >> Anyone have any suggestions? > > I don't see why SWIG is doing this and I can't replicate this > problem. I suggest you post a complete standalone example > demonstrating it... Here is my example (slightly longer than you requested, but short enough, I trust, to serve): *** swigtest.h *** #include <iostream> #include <vector> namespace test { class Bar { public: explicit Bar::Bar(int val=0) : intVal(val) {}; int intVal; }; class Foo { public: explicit Foo::Foo(std::vector<int> const &intVec) { std::cout << "Foo("; for (size_t ind = 0; ind < intVec.size(); ++ind) std::cout << intVec[ind] << ", "; std::cout << ") constructor" << std::endl; } explicit Foo::Foo(std::vector<Bar> const &barVec) { std::cout << "Foo("; for (size_t ind = 0; ind < barVec.size(); ++ind) std::cout << "Bar(" << barVec[ind].intVal << "), "; std::cout << ") constructor" << std::endl; } }; } *** swigtest.i *** %module swigtest %{ #include "swigtest.h" %} %include "std_vector.i" %template(IntVec) std::vector<int>; %template(BarVec) std::vector<test::Bar>; %include "swigtest.h" *** runtest.py *** #!/usr/bin/env python # run swigtest import swigtest # these should work iv = swigtest.IntVec() iv.append(1) iv.append(2) iv.append(3) swigtest.Foo(iv) swigtest.Foo([1, 2, 3]) bv = swigtest.BarVec() bv.append(swigtest.Bar(1)) bv.append(swigtest.Bar(2)) bv.append(swigtest.Bar(3)) swigtest.Foo(bv) swigtest.Foo([swigtest.Bar(1), swigtest.Bar(2), swigtest.Bar(3)]) # these do horrible things, but that is not relevant to the problem being discussed: #swigtest.Foo([1, 2, swigtest.Bar(3)]) #swigtest.Foo([swigtest.Bar(1), swigtest.Bar(2), 3]) When I build it I get a warning about a shadowed method (see appended log). But when I run the test code it works as desired. -- Russell *** Log *** rowen:swigtest rowen$ swig -o swigtest_wrap.cc -c++ -python -I/Users/ rowen/lsst_home/DarwinX86/external/boost/1.37.0/include -I/Library/ Frameworks/Python.framework/Versions/2.5/include/python2.5 -I/Library/ include swigtest.i swigtest.h:24: Warning(509): Overloaded method test::Foo::Foo(std::vector< test::Bar,std::allocator< test::Bar > > const &) is shadowed by test::Foo::Foo(std::vector< int,std::allocator< int > > const &) at swigtest.h:18. rowen:swigtest rowen$ g++ -o swigtest_wrap.os -c -g -Wall -O3 - DLSST_HAVE_TR1=1 -DLSST_LITTLE_ENDIAN=1 -fno-strict-aliasing -fPIC -I/ Users/rowen/lsst_home/DarwinX86/external/boost/1.37.0/include -I/ Library/Frameworks/Python.framework/Versions/2.5/include/python2.5 -I/ Library/include swigtest_wrap.cc swigtest_wrap.cc: In member function ‘swig::PySequence_Ref<T>::operator T() const [with T = int]’: swigtest_wrap.cc:3133: warning: ‘v’ may be used uninitialized in this function rowen:swigtest rowen$ g++ -o _swigtest.so -bundle -undefined suppress -flat_namespace swigtest_wrap.os -L/Users/rowen/lsst_home/DarwinX86/ external/boost/1.37.0/lib -L/Library/Frameworks/Python.framework/ Versions/2.5/lib/python2.5/config rowen:afw-1000 rowen$ swig -version SWIG Version 1.3.36 Compiled with g++ [i386-apple-darwin9.4.0] Please see http://www.swig.org for reporting bugs and further information rowen:swigtest rowen$ ./runtest.py Foo(1, 2, 3, ) constructor Foo(1, 2, 3, ) constructor Foo(Bar(1), Bar(2), Bar(3), ) constructor Foo(Bar(1), Bar(2), Bar(3), ) constructor |