文档章节

模板特化疑问

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:56
字数 463
阅读 3
收藏 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;
}





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

#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

© 著作权归作者所有

首席吹牛官
粉丝 9
博文 368
码字总数 191938
作品 0
闵行
程序员
私信 提问
C++中的特化问题和类型萃取问题

模板的特化 概念  从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针,甚至是经过别的...

qq_38646470
2018/05/13
0
0
c++ 模板之特化

特化  何为特化,特化也是我们指定一些类型,当我们传入响应的类型的时候,模板生成的类是我们指定类型所对应的类。  可能有的时候我们有这样的需求,普通参数我们走平常的模板类,而对于个...

sdoyuxuan
2018/01/25
0
0
C++模板深度解析

定义 Template﹤类型参数表﹥返回类型 函数名 (形参表){函数体} 模板实参推演 在使用函数模板时,请注意以下几点: 显示具体化(模板特化,模板说明) 和函数模板的重载 1、具体化或特化或模...

阿尔法计算生
2017/07/02
0
0
C++模板之特化与偏特化详解

C++函数模板与类模板实例解析C 语言脚本之家 http://www.jb51.net/article/53746.htm C++关键字typename的深入理解C 语言脚本之家 http://www.jb51.net/article/37565.htm 深入分析:C++模板究...

zray4u
2016/07/18
24
0
【c++】模板知识总结

首先来谈谈什么是模板? 形象的来说,模板就是一个创建类或函数的蓝图或者公式。 首先我们来看一个例子: 比如说我们要实现一个函数来比较两个数的值,按照我们以前的习惯,我们会选择重载函...

flowing_wind
2017/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
4
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
4
0
mysql概览

学习知识,首先要有一个总体的认识。以下为mysql概览 1-架构图 2-Detail csdn |简书 | 头条 | SegmentFault 思否 | 掘金 | 开源中国 |

程序员深夜写bug
昨天
10
0
golang微服务框架go-micro 入门笔记2.2 micro工具之微应用利器micro web

micro web micro 功能非常强大,本文将详细阐述micro web 命令行的功能 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架...

非正式解决方案
昨天
8
0
前端——使用base64编码在页面嵌入图片

因为页面中插入一个图片都要写明图片的路径——相对路径或者绝对路径。而除了具体的网站图片的图片地址,如果是在自己电脑文件夹里的图片,当我们的HTML文件在别人电脑上打开的时候图片则由于...

被毒打的程序猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部