C++ 从第二个类调用函数模板

C++ 从第二个类调用函数模板,c++,templates,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 "publi

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

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.cpp”

文件:“class2.h”

文件:“class2.cpp”

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

我说的是函数模板,而不是类模板。我以前见过我要重复的问题,但这不是我想要的。 我在一个类中有两个相同的函数,除了它们的参数类型

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

如果需要专门化,则需要在.h文件中实现默认模板函数,并定义要实现的专门化。在.cpp文件中,您只需实现专门化

文件:class2.h

#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.. */}

我的问题被否决并标记为重复,但在我看来,原来的问题是关于模板类或结构,而不是模板成员函数。无论如何,我试着将void output1 img,T2 integ,float y的代码放在头文件中,错误并没有消失。标记为已删除重复项,但不是向下投票。
template void class2::output<double, long>(double img, long integ, float y);
template void class2::output<float, int>(float img, int integ, float y);
#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
#include "class2.h"
template <>
void class2::output(double img, long integ, float y)
{ /* .. do specialized stuff.. */}