能否在模板类前置声明中设置模板参数默认值?——基于Boost ptree的疑问
Let's break down your questions clearly, using the Boost code examples you provided:
1. Is the declaration in ptree_fwd.hpp a forward declaration?
Yes, that's exactly what it is. The line:
template < class Key, class Data, class KeyCompare = std::less<Key> > class basic_ptree;
is a forward declaration of the basic_ptree template class. Forward declarations exist to inform the compiler that a template class exists without exposing its full implementation (which lives in ptree.hpp with the complete class body). The subsequent typedef in the same file:
typedef basic_ptree<std::string, std::string> ptree;
is just a convenience alias that relies on this forward declaration to be valid.
2. Is it allowed to set template parameter default values in a forward declaration?
Absolutely—C++ standards permit specifying template default parameters in a forward declaration, but with a key rule:
- Default parameters for a template must be defined the first time the template is declared in a translation unit. Once a default is set for a parameter, you can't redefine it in later declarations (though repeating the exact same default is technically allowed, it's redundant).
In Boost's case, the forward declaration in ptree_fwd.hpp sets the default for KeyCompare to std::less<Key>. When the full class definition appears in ptree.hpp:
template<class Key, class Data, class KeyCompare> class basic_ptree;
it omits the default parameter because it's already been established in the forward declaration. This is fully compliant with C++ rules.
This pattern is common in large libraries like Boost because it lets headers use the ptree alias (or basic_ptree template) without pulling in the full, compilation-heavy class definition—speeding up build times for code that only needs to reference the type rather than use its members.
内容的提问来源于stack exchange,提问作者Jonathan Mee

