Extern 模板:声明不声明任何内容

Lio*_*Lio 4 c++ templates declaration extern

我有一个模板类

实验.h:

template <class T>
class ExpOf{
...
}
Run Code Online (Sandbox Code Playgroud)

我在我的代码中反复使用它,例如T = double[以及其他ExpOf不应该知道的类]。所以我认为一次性编译它是个好主意[或两次......]

expofdouble.cpp:

#include "expof.h"
template class ExpOf<double>;
Run Code Online (Sandbox Code Playgroud)

并在不同的标头中声明它,这样当包含 expof.h 时它就不会被编译。

expofdouble.h:

extern template ExpOf<double>;
Run Code Online (Sandbox Code Playgroud)

当我编译这个(clang-800.0.42.1)时,我收到(许多)警告

expofdouble.h: warning: declaration does not declare anything [-Wmissing-declarations]
extern template ExpOf<double>;
                ^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我得到了想要的行为吗?那为什么会出现警告呢?我应该采取不同的做法吗?

cdh*_*wie 5

expofdouble.h应包含这一行:

extern template class ExpOf<double>;
Run Code Online (Sandbox Code Playgroud)

您的声明省略了class关键字,因此它实际上没有声明任何内容。

(请注意,您将收到与类似这样的声明相同的警告extern int;,这显然对您没有任何用处。)