c++ - let function return template type -


i had following function

slabwallconnectionevent* createobservedevent(slabwallconnectionevent::data* peventdata) {     assert(peventdata != nullptr);     return slabwallconnectionevent::create(peventdata->m_wall, peventdata->m_slab); } 

then able make more general template template specification.

.h file

template <class observedeventtype, class observedeventdatatype> void createobservedevent(observedeventtype*& pevent,observedeventdatatype* peventdata); 

.cpp file

template<> void createobservedevent<slabwallconnectionevent, slabwallconnectionevent::data>                 (slabwallconnectionevent*& pevent, slabwallconnectionevent::data* peventdata) {     assert(peventdata != nullptr);     pevent = slabwallconnectionevent::create(peventdata->m_wall, peventdata->m_slab); } 

this works me not pleased reference raw pointer. possible change this:

.h file

template <class observedeventtype, class observedeventdatatype> observedeventtype* createobservedevent(observedeventdatatype* peventdata); 

.cpp file

template<> slabwallconnectionevent* createobservedevent<slabwallconnectionevent, slabwallconnectionevent::data>                 (bim_ui::slabwallconnectionevent::data* peventdata) {     assert(peventdata != nullptr);     return bim_ui::slabwallconnectionevent::create(peventdata->m_wall, peventdata->m_slab); } 

when try use following error:

error   1   error c2783: 'observedeventtype  *createobservedevent(observedeventdatatype *)' : not deduce template  argument 'observedeventtype' 

edit
use function in template function

template <class observedeventtype> void cmdbimdrag::observeconnectionevent(observedeventdata* pobservedevent){     ...     if (pcurrentevent == nullptr)         createobservedevent(pcurrentevent, peventdata);     ... } 

and function gets called this

observeconnectionevent<slabwallconnectionevent>((*pobservedeventdata).get()); 

edit2

jonas' answers first part works specifying template type enough:

createobservedevent<slabwallconnectionevent>(peventdata); 

however using auto not seem warrant removal of return type spefication:

.h file

template <class observedeventtype, class observedeventdatatype> auto createobservedevent(observedeventdatatype* peventdata) -> observedeventtype*; 

.cpp file

template<> auto createobservedevent<slabwallconnectionevent, slabwallconnectionevent::data>     (slabwallconnectionevent::data* peventdata) -> slabwallconnectionevent* {     assert(peventdata != nullptr);     return slabwallconnectionevent::create(peventdata->m_wall, peventdata->m_slab); } 

this code compiles template specification calling:

createobservedevent(peventdata); 

still gives first error not being able deduce type.

you have specific return type:

createobservedevent<slabwallconnectionevent>(peventdata); 

here example, using simpler types.

alternatively, use auto return type , not include template parameter return type. online example here.


Comments

Popular posts from this blog

Command prompt result in label. Python 2.7 -

javascript - How do I use URL parameters to change link href on page? -

amazon web services - AWS Route53 Trying To Get Site To Resolve To www -