为什么模板类的实现和声明应该在同一个头文件中?你能通过举例来解释一下吗?
myTemplate<int>
,你需要看到myTemplate
的完整定义和实现。extern
。这样,那些实例化可以在其他源文件中使用,而不要求模板成员函数的实现可见。但是,除非你包含实现文件,否则你将无法使用其他模板参数集合。myTemplate<int>
和myTemplate<std::string>
为extern
,那么你可以正常使用它们,但如果没有定义myTemplate<double>
为extern
,那么你就无法使用它而不需要实现。他们不必这样做。
必要的是模板定义在实例化点(使用处)可见,这样编译器就能在此处从模板推导出类/函数。
然而,对于模板类,使用两个头文件是非常常见的:
// foo_fwd.hpp
template <typename T, typename U> struct Foo;
// foo.hpp
#include "foo_fwd.hpp"
template <typename T, typename U> struct Foo { typedef std::pair<T,U> type; };
//is_foo.hpp
#include <boost/mpl/bool.hpp>
#include "foo_fwd.hpp"
template <typename Z>
struct is_foo: boost::mpl::false_ {};
template <typename T, typename U>
struct is_foo< Foo<T,U> >: boost::mpl::true_ {};
这可以稍微加快编译时间。