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的特定内容?
答案 0 :(得分:1)
答案在评论中给出,但略有伪装,所以我会在这里扩展它。
在这种情况下,MSVC编译器的工作方式几乎就像在程序代码中进行文本替换一样。它基本上用FiniteElement2D
替换FiniteElement<3>
的所有文本 - 这样显式实例化对你来说很好。
另一方面,其他编译器为typedef
构建了一个合适的抽象语法树,因此,别名用法不会扩展到显式模板实例化。
作为旁注,我不确定您希望从语法中获得什么样的好处。