首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

问一个模版特化的语法,该如何处理

2013-03-04 
问一个模版特化的语法问一个模版特化的语法template class T1, class T2class A{public:void Fun()priv

问一个模版特化的语法
问一个模版特化的语法


template <class T1, class T2>
class A
{
public:
    void Fun();
private:
    T1 t1;
    T2 t2;
};
template <class T1, class T2>
void A<T1, T2>::Fun()
{
}


现在我想对T1特化为DWORD

template <?, class T2>
void A<?, T2>::Fun<DWORD>()
{
}

请问这个Fun应该怎么定义
[解决办法]
你这个是局部特例化

template <>
void A<DWORD, T2>::Fun()
{
}

[解决办法]
你的特化是针对class A的,这样写


template <class T2>
class A<DWORD,T2>
{
public:
    void Fun();
private:
    DWORD t1;
    T2 t2;
};
template <class T2>
void A<DWORD, T2>::Fun()
{
}


但是如果你要把T1和T2都特化了可以这样写
template <>
void A<DWORD, DWORD>::Fun()
{
    std::cout<<"DWORD,DWORD fun"<<std::endl;
}


完整测试代码
template <class T1, class T2>
class A
{
public:
    void Fun();
private:
    T1 t1;
    T2 t2;
};

template <class T1, class T2>
void A<T1, T2>::Fun()
{
    std::cout<<"normal fun"<<std::endl;
}

template <class T>
class A<DWORD, T>
{
public:
    void Fun(){
        std::cout<<"DWORD fun"<<std::endl;
    }
private:
    DWORD t1;
    T t2;
};

template <>
void A<DWORD, DWORD>::Fun()
{
    std::cout<<"DWORD,DWORD fun"<<std::endl;
}
int main()
{
    A<DWORD,int> x;
    A<int,int> y;
    A<DWORD,DWORD> z;
    x.Fun();
    y.Fun();
    z.Fun();
}


输出
DWORD fun
normal fun
DWORD,DWORD fun

[解决办法]
不能偏特化函数模板,因为编译器在决定使用的普通函数、模板函数和偏特化的模板函数中的哪一个时,其规则是很奇怪的:参考Exceptional C++ Style第七条。
如果确实有需要,要么像上面说的那样,偏特化A,要不把void Fun();提取到A的外面,使之成为A的友元函数模板。

热点排行