假设我们有以下文件:

foo.h

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

        ~Foo();

        void DoIt();
    };
}

文件
#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时遇到了问题(虽然我刚刚检查过,我认为这是由于其他原因,但无论如何我都会发布这个问题)

最佳答案

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



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

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

关于c++ - 如何正确显式实例化具有完全特化成员的模板类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29635532/

10-12 23:59