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

模板特化疑问

2013年10月16日 ⁄ 综合 ⁄ 共 2203字 ⁄ 字号 评论关闭

    最近在学习模板,对模板特化做了一些实验

    下面是代码

#include <iostream>
using namespace std;

#include <string>


template <typename T>
class zVector
{
public:
    /**
     * @brief zVector
     * @param size
     */
    zVector(int size = 10):m_size(size),p(new T[size]) {}
    ~zVector(){
        delete p;
    }
    /**
     * @brief operator []
     * @param index
     * @return
     */
    T& operator[](int index)  const {
        return p[index];
    }
private:
    int m_size;
    T *p;
};

template <>
class zVector<void*>
{
public:
    zVector(int size = 10):m_size(size),p(new void*[size]) {}
    ~zVector(){
        delete p;
    }
   void*& operator[](int index)  const {
        return p[index];
    }
private:
    int m_size;
    void* *p;
};


//typedef zVector<void*> zvVector;







template<typename T>
class zVector<T*> : public zVector<void*>
{
public:
    T*& operator [](int index) const {
        return (T*&)zVector<void*>::operator [](index);
    }

};

//template<typename T>
//class zVector<T*> : public zvVector
//{
//public:
//    T*& operator [](int index) const {
//        return (T*&)zvVector::operator [](index);
//    }

//};





int main()
{
    zVector<int*> intv;
    zVector<double*> doublev;
    int i = 1;
    double j = 2.11;
    intv[0] = &i;
    cout << *intv[0] << endl;
    doublev[0] = &j;
    cout << *doublev[0];
    return 0;
}

能够运行且符合我的期望,不过这个是我写的。书上的例子是这个

#include <iostream>
using namespace std;

#include <string>


template <typename T>
class zVector
{
public:
    /**
     * @brief zVector
     * @param size
     */
    zVector(int size = 10):m_size(size),p(new T[size]) {}
    ~zVector(){
        delete p;
    }
    /**
     * @brief operator []
     * @param index
     * @return
     */
    T& operator[](int index)  const {
        return p[index];
    }
private:
    int m_size;
    T *p;
};

//template <>
//class zVector<void*>
//{
//public:
//    zVector(int size = 10):m_size(size),p(new void*[size]) {}
//    ~zVector(){
//        delete p;
//    }
//   void*& operator[](int index)  const {
//        return p[index];
//    }
//private:
//    int m_size;
//    void* *p;
//};


typedef zVector<void*> zvVector;







//template<typename T>
//class zVector<T*> : public zVector<void*>
//{
//public:
//    T*& operator [](int index) const {
//        return (T*&)zVector<void*>::operator [](index);
//    }

//};

template<typename T>
class zVector<T*> : public zvVector
{
public:
    T*& operator [](int index) const {
        return (T*&)zvVector::operator [](index);
    }

};





int main()
{
    zVector<int*> intv;
    zVector<double*> doublev;
    int i = 1;
    double j = 2.11;
    intv[0] = &i;
    cout << *intv[0] << endl;
    doublev[0] = &j;
    cout << *doublev[0];
    return 0;
}

可是就报错了,

我分析发现好像是
typedef zVector<void*> zvVector;
模板特化没有起到作用
这是其中的一个错误
cannot call member function 'T*& zVector<T*>::operator[](int) const [with T = void]' without object
表示void*没有特化,即没有特化T=void*时的模板,所以报错了。
在第一个中我指定特化了,所以能够运行了。

我使用的编译器是g++4.6.3

抱歉!评论已关闭.