Is it possible to forward declare a class that uses default arguments without specifying or knowing those arguments?
For example, I would like to declare a boost::ptr_list< TYPE >
in a Traits class without dragging the entire Boost library into every file that includes the traits. I would like to declare
namespace boost { template<class T> class ptr_list< T >; }
, but that doesn't work because it doesn't exactly match the true class declaration:
template < class T,
class CloneAllocator = heap_clone_allocator,
class Allocator = std::allocator<void*>
>
class ptr_list { ... };
Are my options only to live with it or to specify boost::ptr_list< TYPE, boost::heap_clone_allocator, std::allocator<void*>
in my traits class? (If I use the latter, I'll also have to forward declare boost::heap_clone_allocator
and include <memory>
, I suppose.)
I've looked through Stroustrup's book, SO, and the rest of the internet and haven't found a solution. Usually people are concerned about not including STL, and the solution is "just include the STL headers." However, Boost is a much more massive and compiler-intensive library, so I'd prefer to leave it out unless I absolutely have to.
You cannot give default arguments to the same template parameters in different declarations in the same scope. The compiler will not allow the following example: template<class T = char> class X; template<class T = char> class X { };
Can default arguments be used with the template class? Explanation: The template class can use default arguments.
For example, given a specialization Stack<int>, “int” is a template argument. Instantiation: This is when the compiler generates a regular class, method, or function by substituting each of the template's parameters with a concrete type.
In computer programming, a forward declaration is a declaration of an identifier (denoting an entity such as a type, a variable, a constant, or a function) for which the programmer has not yet given a complete definition.
Yes. Default template arguments may be specified any time, anywhere, so long as the declarations don't conflict with each other. They are ultimately merged together from the various declarations.
Even this is legal:
template< class A, class B, class C = long >
class X;
template< class A, class B = int, class C >
class X;
template< class A = short, class B, class C >
class X { };
A similar example is given in §14.1/10. According to that paragraph, function default arguments behave similarly.
Good luck on getting the forward declaration to behave itself and not barf on everything!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With