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”进行显式实例化。怎么样?
答案 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);
}