最近使用C++ template不是很多. 却需要在多个编译器上进行编译. 开发的时候我的开发环境为Visual Studio 2005. 编译当然是vc++2005了.编译我的几个模板没有出现过问题.
后来,程序需要在g++多个版本下编译. g++3.x的没有问题.但是到了g++-4.0下却出现多个恶心的编译错误.现在一一列出,希望给后来者提供些线索.
1. template class friend 的问题.
很多时候,一个模板我们希望能用typedef来包装过.
比如我的ResourceManager和HResource两个模板类.ResourceManager要使用HResource模板类中的protected成员.那么如下是一种很自然的定义方式:
template <typename T> class HResource
{
typedef ResourceManager<T> MyResMgr;
friend class MyResMgr;
public:
};
这样在大多数编译器上能工作的上. 但是换到g++-4.0就会报错.我们必须规规矩矩的写成:
template <typename T> class HResource
{
typedef ResourceManager<T> MyResMgr;
friend class ResourceManager<T>;
public:
};
实在有够变态.....!
2: template的派生类使用成员变量
template <typename T> class TBase
{
protected:
int m_Size;
};
template <typename T> class TDerived : public TBase<T>
{
void foo()
{
m_Size = 0 ; // 在g++4.0报告找不到变量的定义.
this->m_Size; //正确
TBase<T>::m_Size; //正确
}
};
3: template派生后的静态成员变量问题
/*singleton.h*/
template <typename T> class CSingleton
{
protected:
static T* ms_pSingleton;
};
/*somefile.cpp*/
CSomeClass* CSingleton<CSomeClass>::ms_pSingleton = NULL;//g++-4.0报告模板参数错误
正确的写法为
/*somefile.cpp*/
template<> CSomeClass* CSingleton<CSomeClass>::ms_pSingleton = NULL;
或者在/*singleton.h*/写成这样在
/*singleton.h*/
template <typename T> class CSingleton
{
protected:
static T* ms_pSingleton;
};
template <typename T> T* CSingleton<T>::ms_pSingleton = NULL;
这样CPP文件里就不用再写了.
我比较推荐前一种方式. 但是后一种省力一些.
以上为最近发现的问题,这些在C++的书里都有.但是容易被人忽略.
分享到:
相关推荐
c++标准模板库c++标准模板库。
1、在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 答:class用于定义类,在模板引入c++后,初定义模板的方法为:template,这里class关键字...
涵盖了C++基础语法和使用,面向对象,STL与泛型,Boost库和设计模式,C++编程优化技巧等非常广泛的内容,是市面上非常缺少的深度完整学习C++,培养编程技能和修养的一套系列学习课程。整个课程预计2020年底前录制...
函数调用操作(c++语法中的左右小括号)可以被重载,STL的特殊版本都以仿函数形式呈现。如果对某个class进行operator()重载,它成为一个仿函数。 #include using namespace std; template struct Plus { T ...
5.1.1 需要函数的原因 210 5.1.2 函数的结构 210 5.1.3 使用函数 213 5.2 给函数传递实参 216 5.2.1 按值传递机制 216 5.2.2 给函数传递指针实参 217 5.2.3 给函数传递数组 219 5.2.4 给函数传递引用实参 ...
书中深入地分析了开发不包含逻辑和语法错误的代码技巧以及调试程序的基本原理,介绍了开发和调试命令行代码的过程和方法,说明了关于定位、分析及修复编程错误的方法,介绍了开发 Visual C++程序时所遇到的特殊...
C++11新标准增加的auto不仅可以自动推断变量类型,还能结合decltype来表示函数的返回值。这些新特性可以让我们写出更简洁、更现代的代码。 在泛型编程中,可能需要通过参数的运算来得到返回值的类型。 我们看一下...
单击“替换”按钮逐个行删除空行,或单击“全部替换”按钮删除全部空行(注意:EditPlus有时存在“全部替换”不能一次性完全删除空行的问题,可能是程序BUG,需要多按几次按钮)。 【6】软件技巧——键盘记录的注意...
以PerlHTML :: Template建模的C ++模板类。 两个系统共享相同的语法。
policy是一个虚拟的概念,他定义了某一类class的一些接口规范,并不与C++语法的关键字对应,只是一个抽象的概念。 实例1: //policy模式的常见使用实例smartptr, template < class T, template <class> c
FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows...
FreeCL采用C++语言,大量运用template语法,利用PME编程模式,模拟.Net等快速开发工具的编码风格,包含了常用的Windows标准控件、通用控件、Shell控件、IE风格菜单栏以及通用对话框,不需要开发者掌握繁复的Windows ...
其实GP这种东西最好是建立在无类型语言上面,就C++0X目前对GP的支持的趋势来看,确实如此,auto/varadictemplates这些特性的加入象征着C++GP的形式正越来越转向一种更纯粹的泛性语法描述,表面上你几乎不会看到任何...
包容器和循环子,模板的综述/语法,字符串和整型,向量,模板和继承,多态性和包容器,包容器类型,函数模板,控制实例
★ C++语法不支持模板函数/模板成员函数作为回调函数。本库采用了封装,可以支持模板函数的回调,并且支持最多7个可变参数(可以简易扩充参数个数)。 可以遍历一个TypeList或者枚举值范围CEnumRange,然后以满足...
1、在c++的Template中很多地方都用到了typename与class这两个关键字,而且有时候二者可以替换,那么是不是这两个关键字完全一样呢? 事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template,这里...
一直没有系统去看过c++,因为懂得一些c的基本语法,在实际编程中用到c++,只能用到哪些看哪些,发现这样虽然能够完成大部分工作,但是有时候效率实在太低,比如说这节要讲的Std::sort()函数的使用,调了半天才调通...
它具有简单而强大的模板语法,其中包含您需要的所有变量,循环,条件,包含,回调和注释,并根据需要进行嵌套和组合。 Inja使用nlohmann的精彩库进行数据输入。 最重要的是,inja只需要两个头文件,(几乎)与C ++...
该笔记精简并覆盖了原书所有知识点,纠正了书中几乎所有的错误代码,代码语法均通过 VS 2017 检验,仅有一处因语法复杂编译失败。个别词汇的理解偏差很容易导致误解整个知识点,该笔记在个人的反复理解上,还原了书...
在模板引入c++后,最初定义模板的方法为: template…… 在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字。它的作用同class一样表明后面的...