C++ 模板类重载

C++ 模板类重载,c++,class,templates,overloading,C++,Class,Templates,Overloading,我想知道如何重载模板类。如果我有以下课程。我想为不同类型的T创建不同的函数 template <class T> class A { T data; public: void print_data(void); } 模板 甲级{ T数据; 公众: 作废打印数据(作废); } 如果T是双精度类型,我需要一个类似以下伪代码的函数: template <class T> void A<double>::print_data(){ print

我想知道如何重载模板类。如果我有以下课程。我想为不同类型的T创建不同的函数

template <class T>
class A {
    T data;
public:
    void print_data(void);
}
模板
甲级{
T数据;
公众:
作废打印数据(作废);
}
如果T是双精度类型,我需要一个类似以下伪代码的函数:

template <class T>
void A<double>::print_data(){
   printf("%g",date);
}
模板
作废A::打印_数据(){
printf(“%g”,日期);
}
如果T是复杂类型,我需要它像这样工作:

template <class T>
void A< complex<double> >::print_data(){
    printf("%g+%gi",data.real(),date.imag());
}
模板
作废A::打印数据(){
printf(“%g+%gi”,data.real(),date.imag());
}
我应该如何实现这个目标。谢谢大家!

我找到了一个解决办法,但我认为不是很好。基本思想是使用输入参数进行重载

template <class T>
class A {
public:
    T data;
    void print_data(double);
    void print_data(complex<T>);       
}

template <class T>
void A<T>::print_data(double){
   printf("%g",date);
}
template <class T>
void A<T>::print_data(complex<T>){
    printf("%g+%gi",data.real(),date.imag());
}

int main(void) 
{
    //just demonstrate the idea, may not work
    A<double>    ddata;
    A<complex>   cdata;
    ddata.data = 2.0;
    cdata.data = complex(1,2);

    ddata->print_data(ddata);
    cdata->print_data(cdata);
    return 0;
}
模板
甲级{
公众:
T数据;
无效打印数据(双);
无效打印数据(复杂);
}
样板
作废A::打印_数据(双精度){
printf(“%g”,日期);
}
样板
作废A::打印_数据(复杂){
printf(“%g+%gi”,data.real(),date.imag());
}
内部主(空)
{
//只是演示一下想法,可能行不通
阿达塔;
cdata;
ddata.data=2.0;
cdata.data=复杂(1,2);
ddata->打印数据(ddata);
cdata->打印数据(cdata);
返回0;
}

有谁有更好的解决方案吗?

只需将模板函数专门化为具体类型:

template <>
void A<double>::print_data()
{
    std::cout << data << std::endl;
}
template<>
void A<complex<double> >::print_data(){
    std::cout <<  data.real() << "+" << data.imag() << std::endl;
}
模板
作废A::打印_数据()
{

std::您不能尝试吗?(不要忘记函数返回类型!)对于Skippy,我想创建print_data()函数。我在这里给出的是错误的,它们只是显示了我想要得到的。David:是的,我用返回类型尝试了上面的代码,我得到了一个编译错误。这个解决方案迫使您重新定义模板的每个专门化中常见的所有内容。