我有以下代码
// Foo.h
class A
{
public:
template<typename T>
void doSomething(const T& myT);
};
extern template void A::doSomething<double>(const double& myDouble);
extern template void A::doSomething<int>(const int& myDouble);
template <typename T>
void A::doSomething(const T& myT)
{
static_assert(/* properties of T */);
throw std::exception();
}
字符串
我想在.cpp文件中定义专门化
template <>
void A::doSomething<double>(const double&)
{
// ...
}
template <>
void A::doSomething<int>(const int&)
{
// ...
}
型
在msvc C++17上编译得很好,但在gcc 11.2.1上无法编译。
错误消息为:
error: specialization of 'void A::doSomething(const T&) [with T = double]' after instantiation
型
问题本质上是-如何在.cpp文件中专门化模板?
1条答案
按热度按时间ia2d9nvy1#
您可以在头文件中声明模板专门化:
字符串
这允许您将专门化的实现保存在
.cpp
文件中。旁注:与其在主函数模板中无条件地抛出异常,不如直接删除该实现,以便在有人试图使用它时得到一个链接错误。这也意味着您可以删除专门化的声明:
型