如何使用完全专用的成员正确显式实例化模板类?

Bwm*_*mat 4 c++ template-specialization explicit-instantiation

假设我们有以下文件:

foo.h中

namespace ns
{
    template <typename T>
    class Foo
    {
    public:
        Foo();

        ~Foo();

        void DoIt();
    };
}
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "foo.h"

#include <iostream>

namespace ns
{
    template <typename T>
    Foo<T>::Foo() { std::cout << "Being constructed." << std::endl; }

    template <typename T>
    Foo<T>::~Foo() { std::cout << "Being destroyed." << std::endl; }

    template <>
    void Foo<int>::DoIt()
    {
        std::cout << "Int" << std::endl;
    }

    template <>
    void Foo<double>::DoIt()
    {
        std::cout << "Double" << std::endl;
    }

    template class Foo<int>;
    template class Foo<double>;
}
Run Code Online (Sandbox Code Playgroud)

这是进行显式实例化的正确方法,假设类型只会与int或double一起用作类型参数吗?或者您是否还需要在头文件中声明显式特化?

这样做是我展示的方式与视觉工作室合作,但同事一直遇到GCC问题(虽然我刚刚检查过,我认为这是由于其他原因,但无论如何我都会发布这个问题)

T.C*_*.C. 5

[temp.expl.spec]/p6(强调我的):

如果模板,成员模板或类模板的成员是显式专用的,则应在首次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生此类使用的每个翻译单元中 ; 无需诊断.

事实上,如果你将它们组合在一个TU中,clang和gcc 都会发出错误.您需要声明这些显式特化.


既然我们非常接近它,我也会引用[temp.expl.spec]/p7,因为我可以:

为函数模板,类模板,变量模板,类模板的成员函数,类模板的静态数据成员,类模板的成员类,类模板的成员枚举,类模板的成员类模板,成员函数放置显式特化声明类模板的模板,类模板的静态数据成员模板,类模板的成员模板的成员函数,非模板类的成员模板的成员函数,非模板类的静态数据成员模板,成员类的成员函数模板类模板等,以及类模板,变量模板,非模板类的成员类模板,非模板类的静态数据成员模板,类模板的成员类模板等的部分特化声明的放置,可以根据显式specia的相对位置来影响程序是否格式正确 翻译单元中的lization声明及其实例化点,如上下文所述.写专业时,要注意它的位置; 或者使它编纂将是一种试图点燃其自焚的试验.

  • @alain 最后一行是打油诗。之前的文本被插入以隐藏它。 (2认同)
  • @dyp A*规范*limerick也是. (2认同)