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,pboth 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