当前位置: 首页 > news >正文

模板特化疑问

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

    下面是代码

#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

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

相关文章:

  • perl文件操作
  • 数论 --- 费马小定理 + 快速幂 HDU 4704 Sum
  • 机器翻译漫谈
  • 产生一个长度为100的int数组,并向其中随机插入1-100,不能重复
  • 去掉默认输入框按下时的蓝色边框
  • 阅读第8,9,10章
  • XenDesktop7.6安装部署入门教程
  • 我的视频教学之路
  • .aanva
  • 理念
  • HihoCoder第十一周:树中的最长路
  • Android 四种启动模式 已看晕
  • #etcd#安装时出错
  • mysql主从同步配置详解
  • 中海集运[601866]
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • CSS实用技巧干货
  • Github访问慢解决办法
  • go append函数以及写入
  • HTML中设置input等文本框为不可操作
  • Linux快速复制或删除大量小文件
  • Redux系列x:源码分析
  • SegmentFault 2015 Top Rank
  • SQLServer之创建显式事务
  • 安卓应用性能调试和优化经验分享
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 计算机在识别图像时“看到”了什么?
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 以太坊客户端Geth命令参数详解
  • 怎么把视频里的音乐提取出来
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #pragma预处理命令
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $forceUpdate()函数
  • (待修改)PyG安装步骤
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (六)Hibernate的二级缓存
  • (算法)N皇后问题
  • (转)jQuery 基础
  • (转)winform之ListView
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .“空心村”成因分析及解决对策122344
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net framework profiles /.net framework 配置
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET6 命令行启动及发布单个Exe文件
  • .net和jar包windows服务部署
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /3GB和/USERVA开关
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [<MySQL优化总结>]