c++ - calling a function template from a second class -
i’m trying call function template defined inside class within class, i’m stuck.
error:
1>class1.obj : error lnk2019: riferimento al simbolo esterno "public: void __thiscall class2::output<double,long>(double,long,float)" (??$output@nj@class2@@qaexnjm@z) non risolto nella funzione "public: void __thiscall class1::x(class class2 &)" (?x@class1@@qaexaavclass2@@@z) 1>class1.obj : error lnk2019: riferimento al simbolo esterno "public: void __thiscall class2::output<float,int>(float,int,float)" (??$output@mh@class2@@qaexmhm@z) non risolto nella funzione "public: void __thiscall class1::y(class class2 &)" (?y@class1@@qaexaavclass2@@@z) 1>c:\xxx.exe : fatal error lnk1120: 2 esterni non risolti if uncomment lines duplicate functions (the ones without templates) ok. can fix it?
file: “class1.h”
#ifndef class1 #define class1 #include "class2.h" class class1{ public: void x(class2& c ); void y(class2& c ); }; #endif file: “class1.cpp”
#include "class1.h" void class1::x( class2& c ) { double img; long integ; float y; c.output(img, integ, y); } void class1::y(class2& c ) { float img; int integ; float y; c.output(img, integ, y); } file: “class2.h”
#ifndef class2 #define class2 class class2{ void output2(double img, long integ, float y); void output2(float img, int integ, float y); public: template <typename t1, typename t2> void output(t1 img, t2 integ, float y); //void output(double img, long integ, float y); //void output(float img, int integ, float y); }; #endif file: “class2.cpp”
#include "class2.h" template <typename t1, typename t2> void class2::output(t1 img, t2 integ, float y) {output2(img, integ, y);} //void class2::output(double img, long integ, float y) //{output2(img, integ, y);} //void class2::output(float img, int integ, float y) //{ output2(img, integ, y);} void class2::output2(double img, long integ, float y){/*...*/} void class2::output2(float img, int integ, float y){/*...*/} edit
i’m talking function templates , not class templates. i’ve seen question duplicating before, not i’m looking for. have 2 functions inside class identical except parameters type.
i wanted simple trick avoid writing , maintaining identical code 2 functions inside same class. anyway i’ve found solution, adding these 2 lines @ bottom of class2.cpp:
template void class2::output<double, long>(double img, long integ, float y); template void class2::output<float, int>(float img, int integ, float y);
if want specialization need implement "default" template function in .h file , define specializations implementing. in .cpp file implement specializations.
file: "class2.h"
#ifndef class2 #define class2 class class2{ public: template <typename t1, typename t2> void class2::output(t1 img, t2 integ, float y) { /* .. stuff.. */} }; template <> void class2::output(double img, long integ, float y); #endif file: “class2.cpp”
#include "class2.h" template <> void class2::output(double img, long integ, float y) { /* .. specialized stuff.. */}
Comments
Post a Comment