templates - C++ templated class and generics are not working -
i have this:
template<class e, class p> class listenerinterface { public: virtual listenerresponse handleevent(e<p> *event) const = 0; };
but e , p both templated classes default template parameters.
and i'm getting this:
error: expected ')' virtual listenerresponse handleevent(e<p> *event) const = 0;
using cmake -std=c++14 -wall -w -pedantic
here "minimal, complete, , verifiable" example demonstrates not how resolve immediate error, how create listener
class implements listenerinterface
, while satisfying condition that:
e
,p
both templated classes default template parameters.
first, define classes correspond p
, e
in example:
template <typename t = int> class payload { public: payload (const t & value) : value(value) {} const t value; }; template <typename t = payload<>> class event { public: event (const t & payload) : payload(payload) {} const t payload; };
next, define listenerresponse
, listenerinterface
:
class listenerresponse { public: listenerresponse (const std::string & message) : message(message) {} const std::string message; }; template <typename t> class listenerinterface { public: virtual listenerresponse handleevent (t * event) const = 0; };
note template<class e, class p>
has been replaced template <typename t>
.
now, define listener
class implements listenerinterface
:
template <typename t = event<>> class listener : public listenerinterface<t> { public: listenerresponse handleevent (t * event) const { std::stringstream stream; stream << "event payload value: " << event->payload.value; return listenerresponse(stream.str()); } };
then define main
function puts these pieces together:
int main () { payload<> payload(123); event<> event(payload); listener<> listener; listenerresponse response = listener.handleevent(&event); std::cout << response.message << std::endl; }
here full program, including requisite #include
statements:
#include <iostream> #include <sstream> #include <string> template <typename t = int> class payload { public: payload (const t & value) : value(value) {} const t value; }; template <typename t = payload<>> class event { public: event (const t & payload) : payload(payload) {} const t payload; }; class listenerresponse { public: listenerresponse (const std::string & message) : message(message) {} const std::string message; }; template <typename t> class listenerinterface { public: virtual listenerresponse handleevent (t * event) const = 0; }; template <typename t = event<>> class listener : public listenerinterface<t> { public: listenerresponse handleevent (t * event) const { std::stringstream stream; stream << "event payload value: " << event->payload.value; return listenerresponse(stream.str()); } }; int main () { payload<> payload(123); event<> event(payload); listener<> listener; listenerresponse response = listener.handleevent(&event); std::cout << response.message << std::endl; }
save program example.cc
, compile compiler flags specified, , run verify produces expected output:
$ clang++ -std=c++14 -wall -w -pedantic example.cc -o example $ ./example event payload value: 123
Comments
Post a Comment