从第二个类调用函数模板

时间:2015-07-07 16:43:54

标签: c++ templates

我正在尝试从另一个类中调用一个类中定义的函数模板,但是我被卡住了 我收到错误:

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

如果我取消注释具有重复功能的行(没有模板的行),则可以。 你能帮忙解决一下吗?

文件:“class1.h”

#ifndef CLASS1
#define CLASS1
#include "class2.h"
class class1{
public:
void x(class2& c );
void y(class2& c );
};
#endif

档案:“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);
}

文件:“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

档案:“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){/*...*/}

修改

我说的是功能模板,而不是类模板。我之前看到过我要复制的问题,但这不是我想要的。 我在一个类中有两个函数,除了它们的参数类型之外都是相同的。

我只想要一个简单的技巧来避免为同一个类中的两个函数编写和维护相同的代码。 无论如何,我找到了一个解决方案,在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);

1 个答案:

答案 0 :(得分:0)

如果你想要专业化,你需要实现&#34;默认&#34; .h文件中的模板函数,并定义要实现的特殊化。在.cpp文件中,您只需实现专业化。

文件:&#34; class2.h&#34;

#ifndef CLASS2
#define CLASS2
class class2{
    public:
        template <typename T1, typename T2>
        void class2::output(T1 img, T2 integ, float y)
        { /* .. do stuff.. */}
};
template <>
void class2::output(double img, long integ, float y);
#endif

档案:“class2.cpp”

#include "class2.h"
template <>
void class2::output(double img, long integ, float y)
{ /* .. do specialized stuff.. */}