如何在template类中显式实例化template函数
How to explicitly instantiate the template function in the template class?
b.h:
#ifndef CCC
#define CCC
template<typename T>
class C
{
public: template<typename T1> void F(T1 t1);
};
#endif
b.cc:
#include "b.h"
#include <iostream>
using namespace std;
template<typename T>
template<typename T1>
void C<T>::F(T1 t1)
{
cout<<t1<<endl;
}
a.c:
#include "b.h"
int main(int argc, char* argv[])
{
C<int> c;
c.F(1.0f);
}
make.sh:
#!/bin/bash
g++ b.cc -fPIC -shared -o b.so -std=c++1y
g++ a.cc b.so -o a.out -std=c++1y
g++输出:
/tmp/ccYLnd28.o: In function `main':
a.cc:(.text+0x1f): undefined reference to `void C<int>::F<float>(float)'
collect2: error: ld returned 1 exit status
当a和b分别编译时,似乎需要函数"F"的显式实例化。怎样
我相信您有一个编码错误。T1没有在模板类C中定义。如果希望返回值和参数是不同的类型T1,则必须在模板规范中对其进行命名。或者你只是打字错误。以下任一代码将根据的意图工作
template<typename T>
class C
{
template<typename T>
T F(T t)
{
return t;
}
}
或
template<typename T, T1>
class C
{
template<typename T, T1>
T1 F(T1 t)
{
return t;
}
}
第一个代码段接收一个int并返回一个int。当你传递一个float时,我会工作,因为C++会自动将float转换为int,所以你会得到一个int值。根据功能规范。
第二个代码段接收一个浮点值,并返回一个浮点。您必须修改main以将第二个模板化参数指定为
int main(int argc, char* argv[])
{
C<int, float> c;
c.F(1.0);
}
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 受约束的成员函数和显式模板实例化
- C-callback to function template:显式实例化模板
- 如何在template类中显式实例化template函数