4

假设我们有以下文件:

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 作为类型参数一起使用,这是进行显式实例化的正确方法吗?或者您是否还需要在头文件中声明显式特化?

以我展示的方式与 Visual Studio 一起工作,但一位同事在 GCC 上遇到了问题(虽然我刚刚检查过,我认为这是由于其他原因,但无论如何我都会发布这个问题)

4

1 回答 1

5

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

如果模板、成员模板或类模板的成员是显式特化的,则应在第一次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生这种使用的每个翻译单元中; 不需要诊断。

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


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

非模板类的静态数据成员模板、类模板的成员类模板等,可以根据显式特化声明的相对定位及其在指定的翻译单元中的实例化点影响程序是否格式良好上面和下面。编写专业时,请注意其位置;或者让它编译将是一种试炼,以点燃它的自焚。

于 2015-04-14T19:26:22.570 回答