最近在学习模板,对模板特化做了一些实验
能够运行且符合我的期望,不过这个是我写的。书上的例子是这个
我分析发现好像是
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
下面是代码
#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