C++: "expected ;" in declaration in template -
i've been running following problem inside member function of templated class:
#include <map> using std::map; template <typename a,typename b> class c { public: b f(const a&,const b&) const; private: map<a,b> d; }; template <typename a,typename b> b c<a,b>::f(const a&a,const b&b) const { map<a,b>::const_iterator x = d.find(a); if(x == d.end()) return b; else return x->second; } when have g++ compile following error:
bug.c: in member function 'b c<a,b>::f(const a&, const b&) const': bug.c:12: error:expected ';' before 'x' bug.c:13: error: 'x' not declared in scope however, when make non-templated version of class , function, , b both being int compiles without problem. error little mystifying since can't imagine why wants ';' before 'x'.
you're missing typename:
typename map<a,b>::const_iterator x = d.find(a); please read where , why have put “template” , “typename” keywords?. reason need typename here because a , b template parameters means meaning of ::const_iterator depends on a , b are. while human name const_iterator makes obvious iterator type, compiler doesn't know if type, data member, etc.
the compiler syntax check on first pass before templates instantiated , adding typename letting compiler know parse map<a,b>::const_iterator type.
also, there special rule in c++ (shamefully stolen linked question):
a name used in template declaration or definition , dependent on template-parameter assumed not name type unless applicable name lookup finds type name or name qualified keyword typename.
if not add typename, compiler has assume not type.
Comments
Post a Comment