注册 登录
编程论坛 C++教室

C++的函数模板是不是不能部分具体化?

iloveyn2000 发布于 2014-03-13 09:06, 997 次点击
在C++primer plus的14章里讲到类模板可以部分具体化,如:
template<class T1, class T2>class Pair(T1, T2);
template<class T1>class Pair<int>(T1, int);
我有个小问题就是函数模板能否部分具体化:
template<class T1, class T2>void demo(T1 t1, T2 t2){cout<<"usual function template"<<endl;}
template<class T1>void demo<int> demo(T1 t1, int t2){cout<<"partial specialization template"<<endl;}
我在VS2010 里运行出现错误:
error C2768: “demo”: 非法使用显式模板参数
我想问问是我函数写错还是模板函数本身就无法部分具体化?
程序代码:

#include<iostream>
using std::cout;
using std::endl;

template <class T1, class T2, class T3>
void demo(T1 t1,T2 t2, T3 t3){
    cout<<"usual template "endl;
}

template<class T1, class T2>void demo<T1,T2,int>( T1 t2, T2 t3,int i){
    cout<<"partial specialization template "<<endl;
}

template <>
void demo<int,int,int>(int t1,int t2, int t3){
    cout<<" specialization template: "<<t1<<": "<<t2<<": "<<t3<<endl;
}
int main(){
    demo(1.1,2.2,3.3);
    demo(1.1,2.1,3);
    demo(1,2,3);
    getchar();
    return 0;
}
2 回复
#2
rjsp2014-03-13 10:59
函数可以重载,所以语法上没有必须加入偏特化的功能
程序代码:
#include <iostream>
using namespace std;

template<class T1, class T2, class T3>
void demo( T1 t1, T2 t2, T3 t3 )
{
    cout << "usual template " << endl;
}

template<>
void demo<int,int,int>( int t1, int t2, int t3 )
{
    cout << "specialization template" << endl;
}

template<class T1, class T2>
void demo( T1 t1, T2 t2, const char* t3 ) // 其实是重载
{
    cout << "partial specialization template" << endl;
}

int main()
{
    demo( 1.1, 2.2, 3.3 );
    demo( 1,   2,   3   );
    demo( 1.1, 2.1, "3" );

    return 0;
}

#3
iloveyn20002014-03-13 18:18
回复 2楼 rjsp
谢谢回答。
1