gcc C++文件中模板特化

gr8qqesn  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(128)

我有以下代码

// 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文件中专门化模板?

ia2d9nvy

ia2d9nvy1#

您可以在头文件中声明模板专门化:

#pragma once
#include <exception>

class A {
public:
    template<typename T>
    void doSomething(const T& myT);
};

template<> void A::doSomething<double>(const double& myDouble);
template<> void A::doSomething<int>(const int& myDouble);

template<typename T>
void A::doSomething(const T& myT) {
    throw std::exception();
}

字符串
这允许您将专门化的实现保存在.cpp文件中。
旁注:与其在主函数模板中无条件地抛出异常,不如直接删除该实现,以便在有人试图使用它时得到一个链接错误。这也意味着您可以删除专门化的声明:

#pragma once

class A {
public:
    template<typename T>
    void doSomething(const T& myT);
};

相关问题