2016-10-07 56 views
1

Header.h使用别名的显式模板实例化?

template <int> 
class FiniteElement 
{ 
public: 
    int GetDOF(); 
}; 

using FiniteElement2D= FiniteElement<3>; 
using FiniteElement3D= FiniteElement<6>; 

Source.cpp

#include "Header.h" 

//template class FiniteElement<3>; 
//template class FiniteElement<6>; 
template FiniteElement2D; // Using alias for explicit template instantiation !!! 
template FiniteElement3D; 

template <int DOF> 
int FiniteElement<DOF>::GetDOF() 
    { return DOF; } 

Main.cpp的

#include "Header.h" 
#include <iostream> 

int main() 
{ 
FiniteElement3D Elem; 

std::cout << Elem.GetDOF(); 

return 0; 
} 

令我惊讶的是,上面的程序编译,并与视觉链接Studio 2015 Update 3.我喜欢允许别名用于显式模板实例化的想法,但它似乎不适用于gcc或clang。

它是即将到来的标准的特征还是VS的特定特征?

+0

这未能与当前的Clang/C2(2016年7月)链接,但仍与当今的每日构建(v19.10.24606)链接。请[提交错误报告](https://connect.microsoft.com/VisualStudio/)并在此处发布链接。 – ildjarn

+1

@GuillaumeRacicot回想起来,很容易称之为“愚蠢”,现在很清楚的是一个糟糕的设计决定。 https://blogs.msdn.microsoft.com/vcblog/2015/09/25/rejuvenating-the-microsoft-cc-compiler/是的,VS仍然不符合,是的,所有其他主要编译器都完全符合C + +14现在一段时间。但是你必须对他们的拥有权和(缓慢)进入正确的方向给予好评:https://blogs.msdn.microsoft.com/vcblog/2016/06/07/expression-sfinae-improvements-in-vs- 2015-update-3 /。他们(以及我们作为用户)正在为很久以前犯的一个错误付钱 - **看起来是正确的**。 – bolov

+0

@bolov是的,你是对的。我想我有今天的VS错误负载... –

回答

1

答案在评论中给出,但是以一种轻微的变相方式,所以我会在这里展开它。

MSVC编译器在这种情况下工作的方式几乎就像在程序代码中进行文本替换一样。它基本上用FiniteElement<3>替换FiniteElement2D的所有文本 - 这种方式显式实例对你很好。

另一方面,其他编译器为typedef构建适当的抽象语法树,因此别名用法不会扩展为显式模板实例化。

作为一个方面说明,我不知道你期望从你的语法中获得什么样的好处。