如何在template类中显式实例化template函数

How to explicitly instantiate the template function in the template class?

本文关键字:template 实例化 函数      更新时间:2023-10-16

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);
}