课堂中成员函数模板的明确实例
explicit instanciation of member function template in class
我有一个类,其中包含一个模板方法,如下所示:
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>相关文章:
- 如何使用非默认构造函数实例化模板化类
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 将显式实例化的函数模板与转换匹配
- 函数模板实例化、替换和重载解析的顺序是什么?
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 在实例化之前推断函数模板的返回类型
- 何时需要实例化函数模板定义?
- 如何同时别名和实例化模板函数?
- 没有函数模板的实例与我不知道为什么的参数列表匹配
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- 实例化多种类型的成员函数模板
- 函数模板实例化的 sfinae
- 没有函数模板的实例"max"与参数列表参数类型匹配(int、int)
- 使用 SFINAE 有选择地实例化模板的成员函数
- 找不到使用 bitset 实例化模板函数的有效方法
- 如何简洁地编写大量显式函数模板实例化?
- 无法编译包含"if constexpr"的函数模板实例化
- 如何严格定义函数模板显式实例化规则
- 课堂中成员函数模板的明确实例
- 在定义之前显式实例化模板函数