现在的位置: 首页 > 综合 > 正文

类模版中函数模版

2013年12月12日 ⁄ 综合 ⁄ 共 1352字 ⁄ 字号 评论关闭
/* 
 * File:   main.cpp
 * Author: Administrator
 *
 */
#include <iostream>

template <typename T>
class A {
public:
    void f1(void);

    static void f2(void);

    /**模版类中的模版函数,在类模版A未被特化前,虽然可以声明与定义,
     * 但必须在对应的特化类中重新定义函数!!!顾模版中的模版函数,只需要声明即可,
     * 具体的定义在模版类被特化后进行!顾,在模版类中声明模版函数没有必要,
     * 到不如直接在模版类的特化中声明和定义函数模版*/
    template <typename E>
    void f3(void);
//    {
//        std::cout << "f3" << std::endl;
//    }
};

/** 模版类成员函数的定义 */
template <typename T>
void A<T>::f1(void) {
    std::cout << "f1" << std::endl;
}

/** 模版类特化,成员函数的定义 */
template <>
void A<int>::f1(void) {
    std::cout << "f1 int" << std::endl;
}

/** 模版类'静态'成员函数的定义 */
template <typename T>
void A<T>::f2() {
    std::cout << "f2" << std::endl;
}

/** 模版类特化,'静态'成员函数的定义 */
template <>
void A<int>::f2(void) {
    std::cout << "f2 int" << std::endl;
}

/**模版类的特化后*/
template <>
class A<double> {
public:

    template <typename E>
    void f3(void) {
        std::cout << "f3 A<double>" << std::endl;
    }
};

/**模版类的特化后,对模版函数特化*/
template<>
void A<double>::f3<float>(void) {
    std::cout << "f3 A<double> <float>" << std::endl;
}
/*
 * 
 */
int main(void) {
    A<char> a1;
    a1.f1();
    A<int> a2;
    a2.f1();

    std::cout << "---------------------------" << std::endl;

    a1.f2();
    A<char>::f2();
    a2.f2();
    A<int>::f2();

    std::cout << "---------------------------" << std::endl;
    // a1.f3(); 错误,因为A<char> 特化类中没有f3()
    // a2.f3(); 错误,因为A<int> 特化类中没有f3()
    A<double> a3;
    // a3.f3(); 错误,没有指明模版函数类型参数
    a3.f3<char>();
    a3.f3<bool>();
    a3.f3<float>(); /**对模版函数特化*/

    return 0;
}

 

f1
f1 int
---------------------------
f2
f2
f2 int
f2 int
---------------------------
f3 A<double>
f3 A<double>
f3 A<double> <float>

抱歉!评论已关闭.