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

时间:2016-10-07 14:25:41

标签: c++ templates visual-studio-2015 c++17

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;
}

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

它是即将推出的标准的特征还是VS的特定内容?

1 个答案:

答案 0 :(得分:1)

答案在评论中给出,但略有伪装,所以我会在这里扩展它。

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

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

作为旁注,我不确定您希望从语法中获得什么样的好处。