在存在类模板成员函数的显式专用化的情况下使用“extern template”时出错

Error using `extern template` in the presence of an explicit specialization of a class template member function

提问人:Vittorio Romeo 提问时间:3/17/2023 更新时间:3/17/2023 访问量:176

问:

考虑一个类模板:S

[s.hpp]

template <typename>
struct S
{
    void f() { /* ... */ }
    void g() { /* ... */ }
};

此类模板还附带一个源文件,其中包含以下专用化:S<int>::g()

[s.cpp]

template <>
void S<int>::g() { /* ... */ }

S被实例化了很多次。为了通过避免多次实例化来加快编译时间,我想在头文件中引入一个显式实例化声明(extern template),并在源文件中引入一个相应的显式实例化定义S<int>S<int>s.hpps.cpp

[S.HPP] (已修改)

template <typename>
struct S
{
    void f() { /* ... */ }
    void g() { /* ... */ }
};

extern template struct S<int>;

[s.cpp] (已修改)

template <>
void S<int>::g() { /* ... */ }

template struct S<int>;

但是,这样做会导致以下编译错误:

<source>:11:14: error: explicit specialization of 'g' after instantiation
void S<int>::g() { /* ... */ }
             ^
<source>:8:23: note: explicit instantiation first required here
extern template class S<int>;
                      ^

我假设错误发生是因为仍然被认为是一个实例化,甚至认为它只是一个声明。extern template

如何通过在面向客户端的 S 标头中提供外部模板声明来实现可能的编译速度,同时在源文件中仍保留 S<int>::g 的显式专用化?

C++ C++11 Extern 显式实例化

评论

0赞 Brian61354270 3/17/2023
在标题中隐藏 just 当它包含在其中时会起作用吗?extern template struct S<int>;#ifdefs.cpp

答:

7赞 StoryTeller - Unslander Monica 3/17/2023 #1

在标头中也声明显式专用化。

template <typename>
struct S
{
    void f() { /* ... */ }
    void g() { /* ... */ }
};

template <>
void S<int>::g();

extern template struct S<int>;

提炼规则:在实体成为显式实例化的主题(定义或声明)之前,必须出现显式专用化的声明。因为递归的显式实例化与 相同,所以需要提前声明专用化。S<int>S<int>::g

但是,让我们庆幸我们没有着火