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

时间:2015-04-14 19:11:02

标签: c++ template-specialization explicit-instantiation

我们说我们有以下文件:

foo.h中

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

        ~Foo();

        void DoIt();
    };
}

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>;
}

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

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

1 个答案:

答案 0 :(得分:5)

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

  

如果是模板,成员模板或类模板的成员   明确专门然后应宣布专业化   在第一次使用该特化之前会导致一个   隐式实例化发生在每个翻译单元中   发生了这种用途;无需诊断。

事实上,如果你把它们组合在一个TU中,那就是clang和gcc will issue an error。您需要声明这些显式特化。


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

  

为函数放置显式特化声明   模板,类模板,变量模板,成员函数   类模板,类模板的静态数据成员,成员   类模板类,类模板的成员枚举,   类模板的成员类模板,成员函数模板   类模板,类模板的静态数据成员模板,   类模板的成员模板的成员函数,成员   非模板类的成员模板的功能,静态数据   非模板类的成员模板,成员函数模板   类模板的成员类等,以及部分的放置   类模板的特化声明,变量模板,   非模板类的成员类模板,静态数据成员   非模板类的模板,类的成员类模板   模板等可以影响程序是否格式正确   到显式专业化的相对定位   声明及其在翻译单元中的实例化要点   如上下文所述。写专业时,请   小心它的位置;或者使它编译将是这样的试验   点燃自焚。