提问人:Vittorio Romeo 提问时间:3/17/2023 更新时间:3/17/2023 访问量:176
在存在类模板成员函数的显式专用化的情况下使用“extern template”时出错
Error using `extern template` in the presence of an explicit specialization of a class template member function
问:
考虑一个类模板: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.hpp
s.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
的显式专用化?
答:
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
但是,让我们庆幸我们没有着火。
评论
extern template struct S<int>;
#ifdef
s.cpp