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

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

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/

相关文章:

templates - 如何将多个操作绑定(bind)到 Play! 中的一个模板框架?

C++双指针未知转换

c++ - 如何在解决方案资源管理器中保留源文件夹层次结构?

c# - 从 Visual Studio 扩展中的 ProjectItem 获取 Roslyn SemanticModel

azure - Azure SDK 2.9.1 出现 MSBuild MSB4096 错误

c++ - 如何更改 QtQuick 窗口的背景颜色?

c++ - 如何逐像素填充AvFrame

c++ - 模板继承(在子类成员函数中访问父类的变量和对象)

c++ - 为什么 std::priority_queue 对其容器的元素进行排序?

c++ - boost 库中 float 和 double 的类型定义