假设我们有以下文件:
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/