是否可以在不指定或不知道这些参数的情况下转发声明使用默认参数的类?
例如,我想声明一个 boost::ptr_list< TYPE >
在 Traits 类中,无需将整个 Boost 库拖到包含特征的每个文件中。我想申报
namespace boost { template<class T> class ptr_list< T >; }
,但这不起作用,因为它与真正的类声明不完全匹配:
template < class T,
class CloneAllocator = heap_clone_allocator,
class Allocator = std::allocator<void*>
>
class ptr_list { ... };
我的选择是只接受它还是指定boost::ptr_list< TYPE, boost::heap_clone_allocator, std::allocator<void*>
在我的特质课上? (如果我使用后者,我还必须转发声明 boost::heap_clone_allocator
并包含 <memory>
,我想。)
我浏览了 Stroustrup 的书 SO,以及互联网上的其他内容,但没有找到解决方案。通常人们担心不包含 STL,解决方案是“只包含 STL 头”。但是,Boost 是一个更庞大且编译器密集型的库,因此除非绝对必要,否则我宁愿不使用它。
最佳答案
是的。可以在任何时间、任何地点指定默认模板参数,只要声明不相互冲突。它们最终通过各种声明合并在一起。
即使这样也是合法的:
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 { };
第 14.1/10 节中给出了一个类似的例子。根据该段,函数默认参数的行为类似。
祝你好运,让前向声明能够 self 表现,而不是对所有事情都吐槽!
关于c++ - 带有前向声明的默认模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1792253/