如何在模板类中显式实例化模板函数?

时间:2016-07-22 16:19:10

标签: c++

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.cc:

#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”进行显式实例化。怎么样?

1 个答案:

答案 0 :(得分:0)

我相信你有编码错误。 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。当你传入一个浮点数时我会工作,因为C ++会自动将float转换为int,所以你会得到一个int。根据功能规范。

第二个片段接受一个浮点数,并返回一个浮点数。您必须修改main以指定第二个模板化参数

int main(int argc, char* argv[])
{
    C<int, float> c;
    c.F(1.0);
}