让gcc支持成员函数模板的trick
罗朝辉 (http://blog.csdn.net/kesalin/)
gcc 4.7.3 不支持成员函数模板特化。如下代码:
#ifndef__MEMFUNTEMPLATE_H__
#define__MEMFUNTEMPLATE_H__
#include<stdio.h>
classBase{};
classDerived:publicBase{};
structFunctor{
template<typenameT>voidfunction(){
printf("Primarytemplate.\n");
}
template<>
voidfunction<int>(){
printf("Specializationforint.\n");
}
template<>voidfunction<Base*>(){
printf("SpecializationforBase*.\n");
}
};
classTester{
public:
staticvoidDoTest()
{
Functorfunctor;
functor.function<char>();
functor.function<int>();
functor.function<Base*>();
functor.function<Derived*>();
}
};
#endif//__MEMFUNTEMPLATE_H__
在 VS2010 中编译运行是没有问题的,但在 gcc 4.7.3下,编译都通不过:
../src/MemFunTemplate.h:21:14:error:<strong>explicitspecializationinnon-namespacescope</strong>‘structFunctor’
../src/MemFunTemplate.h:22:24:error:template-id‘function<int>’indeclarationofprimarytemplate
../src/MemFunTemplate.h:26:14:error:explicitspecializationinnon-namespacescope‘structFunctor’
../src/MemFunTemplate.h:26:38:error:template-id‘function<Base*>’indeclarationofprimarytemplate
../src/MemFunTemplate.h:26:21:error:‘voidFunctor::function()’cannotbeoverloaded
../src/MemFunTemplate.h:22:10:error:with‘voidFunctor::function()’
../src/MemFunTemplate.cpp:Infunction‘intmain()’:
../src/MemFunTemplate.cpp:17:2:error:‘DoTest’isnotamemberof‘Functor’
为了达到近似成员函数模板特化的效果,可以利用成员函数主模板以及重载函数来实现:
/*
*MemFunTemplate.h
*
*Createdon:Jul12,2013
*Author:http://blog.csdn.net/kesalin/
*/
#ifndefMEMFUNTEMPLATE_H_
#defineMEMFUNTEMPLATE_H_
#include<stdio.h>
template<typenameT>
structDummyIdentity{
typedefTtype;
};
classBase{};
classDerived:publicBase{};
structFunctor{
template<typenameT>voidfunction(){
function(DummyIdentity<T>());
}
private:
template<typenameT>
voidfunction(DummyIdentity<T>){
printf("PrimarytemplateDummyIdentity<T>
.\n");
}
voidfunction(DummyIdentity<int>){
printf("overloadfunctionforDummyIdentity<int>
.\n");
}
voidfunction(DummyIdentity<Base*>){
printf("overloadfunctionforDummyIdentity<Base*>
.\n");
}
};
classTester{
public:
staticvoidDoTest()
{
Functorfunctor;
functor.function<char>();
functor.function<int>();
functor.function<Base*>();
functor.function<Derived*>();
}
};
#endif/*MEMFUNTEMPLATE_H_*/
调用 DoTest() 运行结果如下:
PrimarytemplateDummyIdentity<T>
.
overloadfunction
forDummyIdentity<
int>
.
overloadfunction
forDummyIdentity<Base*>
.
PrimarytemplateDummyIdentity<T>
.
注意:
VS2010 版本的代码,模板形参为 T,在实例化不会进行隐式类型转换。即用Derived * 当作实参调用的是主模板,而不是 Base * 特化版本
而在 gcc 下,模板形参虽然也为T,但影响重载决议的 function 参数为:DummyIdentity<T>,用不同的实际参数实例化该模板,得到的是一堆重载函数。因此用Derived * 当作实参时,调用的函数自然就是实例化的void function(DummyIdentity<T>)了。
分享到:
相关推荐
GCC下C语言函数大全,以及如何使用。文件格式为html格式.
广义互相关函数,包含所有互相关的权函数,可以方便的使用它,其中PHAT加权效果最好!
收集一个函数调用的踪迹,一种方法是通过在函数的入口处和出口处插入一个打印语句来检测。这个过程非常繁琐,而且很容易...幸运的是,GNU 编译器工具链(也称为 gcc)提供了一种自动检测应用程序中的各个函数的方法。
gcc编译时出现异常,发现pow函数找不到。 对该编译问题的解决办法总结
根据加权函数的不同,广义互相关函数有多种不同的变形,其中广义互相关-相位变换方法(Generalized Cross Correlation PHAse Transformation,GCC-PHAT)方法应用最为广泛。GCC-PHAT方法本身具有一定的抗噪声和抗...
gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册 gcc manual gcc手册
基于GCC的STM32F1工程模板,可在Linux下编译,编译时需要安装arm-none-eabi-gcc编译器。
在vscode下使用armgcc编译gd32f407程序,包含相关配置文件,经过测试可以下载、调试。
gcc、gcc++ 离线安装包
gcc各版本文档,具体包括: gcc11_2、gcc10_3、gcc9_4、gcc8_5、gcc7_5、gcc6_5、gcc5_5、gcc4_9_4、gcc4_8_5、gcc4_7_4、gcc4_6_4、gcc4_5_4、gcc4_4_7、gcc4_3_6、gcc4_2_4、gcc4_1_2、gcc4_0_4、gcc3_4_6
离线安装GCC与GCC-C++
ARM汇编器与GCC汇编器支持的汇编语言差别
言,COBOL 语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。
从mini安装版centos7.5提取出来的gcc和gcc-c++安装包,下载后放到服务器解压,并cd到该目录,执行 rpm -Uvh *.rpm,安装完成后,运行gcc -v,g++ -v,会出现版本信息,则完成
自己整理的GCC手册,包含GCC的各种参数讲解,不同环境下的makefile的写法,希望对大家有帮助.
1.最近有离线安装redis6+的需要,同样Redis离线构建依赖于gcc高版本; 2.内含gcc的依赖,总结的构建命令; 3.gcc构建过程极其耗时1h+; 4.gcc构建存储空间6G+,虚拟机的小伙伴注意剩余存储空间,免走我的空间问题的...
有关创新创业的演讲稿创新创演讲稿范文推荐.pdf
从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的...第一步是进行预编译,使用-E参数可以让GCC在预处理结束后停止编译过程: # gcc -E hello.c -o hello.i
GCC 论述gcc当中lib库 以及各种lib库的优缺点
gcc技术手册 for GCC 4.5.3