博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板特化疑问
阅读量:7208 次
发布时间:2019-06-29

本文共 2758 字,大约阅读时间需要 9 分钟。

hot3.png

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

    下面是代码

#include 
using namespace std;#include
template
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
{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
zvVector;template
class zVector
: public zVector
{public: T*& operator [](int index) const { return (T*&)zVector
::operator [](index); }};//template
//class zVector
: public zvVector//{//public:// T*& operator [](int index) const {// return (T*&)zvVector::operator [](index);// }//};int main(){ zVector
intv; zVector
doublev; int i = 1; double j = 2.11; intv[0] = &i; cout << *intv[0] << endl; doublev[0] = &j; cout << *doublev[0]; return 0;}

能够运行且符合我的期望,不过这个是我写的。书上的例子是这个
#include 
using namespace std;#include
template
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
//{//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
zvVector;//template
//class zVector
: public zVector
//{//public:// T*& operator [](int index) const {// return (T*&)zVector
::operator [](index);// }//};template
class zVector
: public zvVector{public: T*& operator [](int index) const { return (T*&)zvVector::operator [](index); }};int main(){ zVector
intv; zVector
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

转载于:https://my.oschina.net/u/854744/blog/418390

你可能感兴趣的文章
Windows command tools
查看>>
Webpack 最佳实践总结(一)
查看>>
【138天】尚学堂高淇Java300集视频精华笔记(84)
查看>>
docker与git实现push-to-deploy
查看>>
vue2.0 与 bootstrap datetimepicker的结合使用
查看>>
ant design后台模板-1.前端环境搭建
查看>>
什么是npm ?
查看>>
php 中continue break exit return 的区别
查看>>
敏捷爽畅模型及其演变——Diana Larsen专访
查看>>
Bootstrap 4 正式发布,却可能生不逢时
查看>>
PWA即将推向所有Chrome平台
查看>>
修复.NET的HttpClient
查看>>
服务应该去版本化,不管是微服务还是SOA
查看>>
GitHub Draft Pull请求支持新的协作流程
查看>>
JShell:Java REPL综合指南
查看>>
为你的组织设计自己的障碍消除流程
查看>>
为什么你写的代码糟透了?
查看>>
使用Flutter一年后,这是我得到的经验
查看>>
滴滴进入寒冬期,将裁员2000人
查看>>
被批伪开源!刚刚融资6千万美元的Redis怎么了?
查看>>