程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 讓gcc支持成員函數模板的trick

讓gcc支持成員函數模板的trick

編輯:C++入門知識

本文遵循“署名-非商業用途-保持一致”創作公用協議   gcc 4.7.3 不支持成員函數模板特化。如下代碼:  

 __MEMFUNTEMPLATE_H__<stdio.h>

 Derived : <typename T> <>
     function<><>  function<Base *> <><><Base *><Derived *> 

 

在 VS2010 中編譯運行是沒有問題的,但在 gcc 4.7.3下,編譯都通不過:

../src/MemFunTemplate.h:21:14: error: explicit specialization in non-namespace scope ‘struct Functor’
../src/MemFunTemplate.h:22:24: error: template-id ‘function<int>’ in declaration of primary template
../src/MemFunTemplate.h:26:14: error: explicit specialization in non-namespace scope ‘struct Functor’
../src/MemFunTemplate.h:26:38: error: template-id ‘function<Base*>’ in declaration of primary template
../src/MemFunTemplate.h:26:21: error: ‘void Functor::function()’ cannot be overloaded
../src/MemFunTemplate.h:22:10: error: with ‘void Functor::function()’
../src/MemFunTemplate.cpp: In function ‘int main()’:
../src/MemFunTemplate.cpp:17:2: error: ‘DoTest’ is not a member of ‘Functor’

 

為了達到近似成員函數模板特化的效果,可以利用成員函數主模板以及重載函數來實現:

  MEMFUNTEMPLATE_H_<stdio.h><typename T>
 Derived : <typename T> <T><typename T>
     function(DummyIdentity<T> function(DummyIdentity<> function(DummyIdentity<Base *> <><><Base *><Derived *> /* MEMFUNTEMPLATE_H_ */

 

調用 DoTest() 運行結果如下:

 Primary template DummyIdentity<T> DummyIdentity<> DummyIdentity<Base *><T>....

 

Derived * 當作實參調用的是主模板,而不是 Base * 特化版本

而在 gcc  下,模板形參雖然也為T,但影響重載決議的 function 參數為:DummyIdentity<T>,用不同的實際參數實例化該模板,得到的是一堆重載函數。因此用 Derived * 當作實參時,調用的函數自然就是實例化的 void function(DummyIdentity<T>)了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved