【发布时间】:2016-04-11 23:16:47
【问题描述】:
最近,当我试图优化我的包含层次结构时,我偶然发现了文件a.hpp:
template<class T>
class A
{
using t = typename T::a_t;
};
class B;
extern template class A<B>;
这似乎是不正确的。实际上,似乎最后的 extern 模板语句会导致 A<B> 的实例化,这会导致编译器抱怨类型不完整。
我的目标是在a.cpp 中定义A<B>:
#include <b.hpp>
template class A<B>;
这样我就不必从a.hpp 中包含b.hpp,这似乎是减少编译时间的好主意。但是它不起作用(a.hpp 本身无法编译!)有没有更好的方法来做到这一点?
注意:当然我不能使用显式模板实例化,但这不是我想要的!如果使用A<B>,我想“预编译”以节省编译时间,但如果不使用A<B>,我不想在每个使用a.hpp 的文件中包含b.hpp!
【问题讨论】:
-
您使用的是哪个编译器?
-
我试过 clang 3.6.1 和 gcc 4.8.2...
-
“它不起作用”。请详细说明您的意思。你的意思是它不再编译?还是您的意思是它并没有像您希望的那样减少编译时间?
-
我更新了问题。 “它不起作用”是指如果一个源文件,比如
main.cpp,只包含a.hpp,但不包含b.hpp,那么main.cpp不会编译,因为B类型不完整。
标签: c++ templates c++11 incomplete-type