Re: template class, methods and friend, unable to link
On Dec 17, 12:08 pm, Victor Bazarov <v.Abaza...@comAcast.net> wrote:
suresh.amritapuri wrote:
> [..]
Thanks, but reading the faq did not help me :(
Mmm... Didn't it? You don't have linker errors any longer, do you?
> Here is my modification
and still g++ cribs. has indicated error against the two offending
lines
Any suggestions pls?
suresh
//tree.h
#include "factorGraph.h"
template <typename Vertex>
class Tree{
public:
Tree(FactorGraph f):fg(f){}
//Vertex root(){return root;} //returns the root
void root(Vertex rt){rootVertex=rt;} //sets the root
friend ostream & operator<< (ostream& o, const Tree<Vertex>& );
void test();
private:
Vertex rootVertex;
FactorGraph fg;
};
//#include "tree.cpp"
#endif /* TREE_H_ */
//tree.cpp
#include "tree.h"
template<typename Vertex> class Tree;
Uh... Why do you need this [re-]declaration? Doesn't the header contai=
n
the definition of the 'Tree' class template?
template<typename Vertex> ostream & operator<<(ostream& o, const
Tree<Vertex>& t );
OK, a declaration.
template<typename Vertex> void Tree<Vertex>::test(void); //error:
declaration of =91void Tree<Vertex>::test()' outside of class is not
definition
Why do you think you need this line? The compiler is quite apparent
that it doesn't like it.
template<typename Vertex>
ostream & operator<<(ostream& o, const Tree<Vertex>& t ){
//o << t.fg << endl;
return o;
}
OK, a definition.
template<typename Vertex>
void Tree<Vertex>::test(){ cout << "Namasivayah" << endl;}
OK, a generic definition.
template class Tree<Vertex>;
Uh... What's that? Looks a bit like an explicit instantiation. Do y=
ou
have the type 'Vertex' which is concrete?
template ostream& operator<<<Vertex>(ostream& o, const Tree<Vertex>&
t );
OK, looks like an explicit instantiation.
template void Tree<Vertex>::test<Vertex>();//error: variable or field
=91test' declared void, expected `;' before =91<' token
Well, 'test' is not a template. 'Tree' is a template. And I am not
sure you can explicitly instantiate template members.
What is it you're trying to accomplish?
Hi Victor,
thanks for replying, but I am still in trouble. I have put the
complete code, with my intentions below. I have removed the test()
because I just added it for testing only.
typedef adjacency_list<vecS, vecS, undirectedS, vertex_properties,
edge_properties> Graph;
typedef graph_traits<Graph>::vertex_descriptor Vertex; //boost graph
library
//these lines are added as suggested in C++ FAQ 35.16
template<typename Vertex> class Tree;
template<typename Vertex> ostream & operator<<(ostream& o, const
Tree<Vertex>& t );
template <typename Vertex>
class Tree{
public:
Tree(FactorGraph f):fg(f){}
Vertex root(){return root;} //returns the root
void root(Vertex rt){rootVertex=rt;} //sets the root
friend ostream & operator<< <>(ostream& o, const Tree<Vertex>& ); //
added <> after operator as suggested in FAQ 35
private:
Vertex rootVertex;
FactorGraph fg;
};
//#include "tree.cpp"
#endif /* TREE_H_ */
//my main.cpp
int main(){
//relevant portion only
FactorGraph fg(factors,vars,edges);
fg.sumProduct();
fg.displayMarginals();
Tree<vertex_properties> mytree(fg);
cout << mytree << endl; //Error: undefined reference to
`std::basic_ostream<char, std::char_traits<char> >& operator<<
<vertex_properties>(std::basic_ostream<char, std::char_traits<char>
&, Tree<vertex_properties> const&)'
collect2: ld returned 1 exit status
}
Hoping to hear from you,
regards
suresh