From: Adam A S. <aa...@cs...> - 2009-07-29 07:27:17
|
Hi-- Having a bit of trouble with SWIG templates. What's going on is that I have a class with two templated functions. One calls the other. However, with the assorted renaming happening with SWIG, it can't seem to find it. Here's the error I get, when compiling the SWIG-generated .cxx file: TreeTemplateTools.h: In static member function static std::vector<N*, std::allocator<N*> > bpp::TreeTemplateTools::searchNodeWithName(N&, const std::string&) [with N = bpp::Node]: TreeTemplateTools_wrap.cxx:65020: instantiated from here TreeTemplateTools.h:356: error: no matching function for call to bpp::TreeTemplateTools::searchNodeWithId(bpp::Node&, const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::vector<bpp::Node*, std::allocator<bpp::Node*> >&) Here's a pared-down version of my .i file: %module treetemplatetools %{ #include "TreeTemplateTools.h" %} %include "TreeTools.i" %include "std_vector.i" using namespace std; class TreeTemplateTools { public: TreeTemplateTools(); virtual ~TreeTemplateTools(); template<class N> static vector<N *> searchNodeWithId(N & node, int id); template<class N> static void searchNodeWithId(N & node, int id, vector<N *> & nodes); template<class N> static vector<N *> searchNodeWithName(N & node, const string & name); template<class N> static void searchNodeWithName(N & node, const string & name, vector<N *> & nodes); }; %template(nodeSearchNodeWithId) TreeTemplateTools::searchNodeWithId<Node>; %template(nodeSearchNodeWithName) TreeTemplateTools::searchNodeWithName<Node>; Finally, the function searchNodeWithName is defined within TreeTemplateTools.h. It's pretty simple--the main thing it does is call searchNodeWithId: template<class N> static vector<N *> searchNodeWithName(N & node, const string & name) { vector<N *> nodes; searchNodeWithId<N>(node, name, nodes); return nodes; } Does anybody have an idea what's going on? Why can't it find the searchNodeWithId function? Thanks, Adam |
From: Josh C. <jc...@nc...> - 2009-07-29 13:19:08
|
On Wed, 29 Jul 2009, Adam A Smith wrote: > Having a bit of trouble with SWIG templates. What's going on is that I have a > class with two templated functions. One calls the other. However, with the > assorted renaming happening with SWIG, it can't seem to find it. Here's the > error I get, when compiling the SWIG-generated .cxx file: It's your C++ compiler that doesn't find it. Have you tried calling these functions from C++? > TreeTemplateTools.h:356: error: no matching function for call to > bpp::TreeTemplateTools::searchNodeWithId(bpp::Node&, const > std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, > std::vector<bpp::Node*, std::allocator<bpp::Node*> >&) ... > Finally, the function searchNodeWithName is defined within TreeTemplateTools.h. > It's pretty simple--the main thing it does is call searchNodeWithId: > > template<class N> > static vector<N *> searchNodeWithName(N & node, const string & name) > { > vector<N *> nodes; > searchNodeWithId<N>(node, name, nodes); > return nodes; > } > > Does anybody have an idea what's going on? Why can't it find the > searchNodeWithId function? Looks to me like no function with that signature exists. You probably meant to call searchNodeWithName, in which case it's a bug in your C++ code and has nothing to do with SWIG. Josh |
From: Adam A S. <aa...@cs...> - 2009-07-29 16:21:39
|
> It's your C++ compiler that doesn't find it. Have you tried calling these > functions from C++? Yup--works perfectly well, in other cases. And it compiles just fine if I remove the searchNodeWithName %template line from the .i file. > Looks to me like no function with that signature exists. You probably meant > to call searchNodeWithName, in which case it's a bug in your C++ code and has > nothing to do with SWIG. The compiler is gcc, with which I haven't had any troubles before. I'll have to check with the original authors to see if it should really be calling searchNodeWithName. But even if that's the case, why would it not find the function? I definitely agree with you that it can't find the signature it's looking for. But that seems tied to SWIG's managing of the templates, and the internal renaming that's happening. Thanks, Adam |
From: Josh C. <jc...@nc...> - 2009-07-29 16:41:55
|
On Wed, 29 Jul 2009, Adam A Smith wrote: > And it compiles just fine if I > remove the searchNodeWithName %template line from the .i file. That's because no call to that function is generated without the %template line. It has nothing to with the way SWIG names things. > The compiler is gcc, with which I haven't had any troubles before. I'll have > to check with the original authors to see if it should really be calling > searchNodeWithName. But even if that's the case, why would it not find the > function? Because it doesn't exist. > I definitely agree with you that it can't find the signature it's looking > for. But that seems tied to SWIG's managing of the templates, and the > internal renaming that's happening. Inspection reveals an apparent bug in your C++ that would produce precisely that compiler error: searchNodeWithId is called with a string as its second argument, but no such signature exists. You'll have to work out what's going on with your C++. Josh |
From: Adam A S. <aa...@cs...> - 2009-07-29 17:32:44
|
> Inspection reveals an apparent bug in your C++ that would produce precisely > that compiler error: searchNodeWithId is called with a string as its second > argument, but no such signature exists. You'll have to work out what's going > on with your C++. I think you just might be right. Thanks again for your help. Adam |