文档章节

模板特化疑问

首席吹牛官
 首席吹牛官
发布于 2015/05/22 12:56
字数 463
阅读 1
收藏 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
26
0
【c++】模板知识总结

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

flowing_wind
2017/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 linuxdeployqt qt5.13.1 打包程序

原文链接:https://www.cnblogs.com/linuxAndMcu/p/11016322.html 一、简介 linuxdeployqt 是Linux下的qt打包工具,可以将应用程序使用的资源(如库,图形和插件)复制到二进制运行文件所在的...

shzwork
27分钟前
4
0
IDEA 配置Springboot项目热部署

实现的方式概述 注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟) File-Settings-C...

小强的进阶之路
37分钟前
9
0
免费数据分析工具:secsoso

前段时间思考了理想数据分析平台,之后我们根据这个思路开发了spl语言并提供了一个数据分析平台,这个平台主要用在搜索ES,数据库索引中的数据。但后来发现对文件的事后处理也是个非常重要的...

赛克蓝德
39分钟前
5
0
暗黑2不能正常启动?带你轻松使用WIN10运行游戏

暗黑破坏神2这款游戏由于年代比较久远,所以设置启动这方面与现在的大部分游戏有很大差距,由于当初完美运行暗黑2是当年使用最多的XP系统,在使用现在大多数玩家使用的WIN7到WIN10系统常会出...

太空堡垒185
44分钟前
6
0
maven项目对象模型(二)

1.4.4.传递性依赖 一个传递性依赖就是一个依赖的依赖。如果project-a依赖于project-b,而后者接着依赖于project-c,那么project-c就是被认为是project-a的传递性依赖。如果project-c依赖于p...

万建宁
44分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部