当我阅读boost :: unordered_map源代码时,我对该类的定义感到困惑,如下所示:
template <class K, class T, class H, class P, class A>
class unordered_map
{
public:
typedef K key_type;
typedef std::pair<const K, T> value_type;
typedef T mapped_type;
typedef H hasher;
typedef P key_equal;
typedef A allocator_type;
private:
typedef boost::unordered::detail::map<A, K, T, H, P> types;
typedef typename types::traits allocator_traits;
typedef typename types::table table;
...
private:
table table_;
public:
// constructors
explicit unordered_map(
size_type = boost::unordered::detail::default_bucket_count,
const hasher& = hasher(),
const key_equal& = key_equal(),
const allocator_type& = allocator_type());
...
};
H类,P类和A类没有默认值,那么为什么用户可以声明像boost::unordered_map<Key, Value> map
这样的地图实例?
我没找到任何指南。有人可以帮忙吗?详细的文件/链接是最好的。
答案 0 :(得分:4)
<boost/unordered/unordered_map.hpp>
包含<boost/unordered/unordered_map_fwd.hpp>
,其中包含以下声明:
dbpath
答案 1 :(得分:2)
如果您开始查看第一个头文件,即实际#include
的头文件,您将找到此模板的声明,该声明指定模板参数的所有默认值。 (该声明可能不在实际的头文件中,而是在那里的#include
d内部头文件中。)
声明首先被编译,并声明默认值,你在这里看到的是实际的模板定义。
初始模板声明已经指定了模板参数的默认值,并且不需要在此模板定义中指定(事实上,如果确实如此,它将是编译错误。)
一个简短的例子:
// Initial declaration
template<typename T=int> class foo;
// Definition
template<typename T> class foo {};
// Usage
foo<> bar;
实际的Boost头文件结构非常复杂,模板的声明和定义分散在不同的文件中,出于各种各样的原因,由实际的头文件{{1}按正确的顺序组装在你的代码中。