Header.h
template <int>
class FiniteElement {
public:
int GetDOF();
};
using FiniteElement2D = FiniteElement<3>;
using FiniteElement3D = FiniteElement<6>;
源.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 的特定特性?
最佳答案
答案在评论中给出了,但略有变相,所以我会在这里展开。
MSVC 编译器在这种情况下的工作方式几乎就像在程序代码中进行文本替换一样。它基本上替换了 FiniteElement2D
的所有文本与 FiniteElement<3>
- 这样显式实例化就可以正常工作。
另一方面,其他编译器为 typedef
构建了合适的抽象语法树。 ,因此,别名用法不会扩展到显式模板实例化。
作为旁注,我不确定您希望从语法中获得什么样的好处。
关于c++ - 使用别名的显式模板实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39919607/