课堂中成员函数模板的明确实例

explicit instanciation of member function template in class

本文关键字:实例 函数模板 成员 课堂      更新时间:2023-10-16

我有一个类,其中包含一个模板方法,如下所示:

Class MyClass {
public :
   template <class T>
   int memberFunction(T& arg);
}

函数模板在.cpp中定义如下:

template<class T> int MyClass::memberFunction(T& arg){
    return arg*arg + arg + 0.2;
}

并在CPP文件中实现如下:

template
int MyClass::memberFunction<int>(int&);
template
int MyClass::memberFunction<double>(double&);

代码在GCC和MSCV下编译,但是每当我使用功能时,MSCV都会返回警告消息,要求明确的Instanciation。我试图将Instanciation放在标题中,但会引发错误,我应该怎么做?

您可以在标题中提供明确的实例声明:

class MyClass {
public :
   template <class T>
   int memberFunction(T& arg);
};
extern template
int MyClass::memberFunction<int>(int&);
extern template
int MyClass::memberFunction<double>(double&);

此明确的实例声明,虽然这里并非严格需要,但可能足以安抚MSVC。

您可以在标题中定义函数模板,以避免链接器警告,类似的东西,myclass.h

class MyClass {
public :
   template <class T>
   T memberFunction(const T& arg) {
       return arg*arg + arg + 0.2;
   }
};

请注意,模板成员函数声明声明的更改。您无需分开声明和定义,也不需要明确定义对于INT和双重类型的专业化,因为您的功能行为对于INT和Double是相同的。请注意可能的代码膨胀。稍后,您可以使用函数,例如以下

#include "myclass.h"
int main(int argc, char** argv) {
MyClass c1;
int res = c1.memberFunction(3);
printf("result=%d",res);
return 0;
}

,让编译器推断出参数的类型,并暗中对功能进行适当的实例化。如果您确实需要ant int从功能返回,则可以对结果进行一些演员。

如果您确实需要以一种需要在CPP文件中定义函数模板成员并抑制链接器警告的方式分离模板函数声明和定义,则可以处理编译器的行为,如果您使用编译器具有称为导出的关键字的,如果由编译器支持,则可以使用它或使用Extern关键字。在这种情况下,这个想法是在标题中明确实例化模板函数,该编译器在在CPP文件中采用定义的时候具有适当的实例化,或者像您在CPP文件中对所需类型的明确声明一样。

<</p> <</p> <</p> <</p> <</p>