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

Explicit template instantiation using alias?

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或叮当声。

它是即将发布的标准的特性还是 VS 的特定特性?

答案在评论里给出了,只是稍微变相了,所以我在这里展开一下。

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

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

附带说明一下,我不确定您希望从语法中获得什么样的好处。