模板特化疑问

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

    下面是代码ios

#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
相关文章
相关标签/搜索