因此this question的优秀答案表明您可以在前向声明中默认模板类型,但是:
您只能指定一次默认模板参数
这在链接问题中有更全面的说明,但Boost的属性树内容适用于ptree
类型:
typedef basic_ptree<std::string, std::string> ptree;
但basic_ptree
类定义如下:
template<class Key, class Data, class KeyCompare>
class basic_ptree
ptree
typedef
仅使用2个模板参数定义的唯一原因是在typedef
之前有前向声明:
template < class Key, class Data, class KeyCompare = std::less<Key> >
class basic_ptree;
这让我想到了我的实际问题。我需要绕过ptree
。但我不想在我的标题中加入Boost
。这意味着我必须转发声明。 但是我无法匹配默认的前向声明,因为默认只能声明一次。
如何编写前向声明和转发typedef,这取决于另一个标头前向声明中的默认值?
我目前正在这样做,但这意味着我不转发typedef
,我正在制作新 typedef
:
template <class Key, class Data, class KeyCompare> class basic_ptree;
typedef basic_ptree<std::string, std::string, std::less<std::string>> ptree;
为了保持一致性,我希望依赖原始basic_ptree
ptree
所依赖的typedef
默认的默认声明。
答案 0 :(得分:1)
简短的回答是你无法做到。您要么必须保证不会包含其他声明,以便您可以指定自己的默认值,或者您需要依赖其他声明。
但我觉得这是一个XY problem,对于以下声明:
但我不想在我的标题中包含Boost。
为什么不呢?您的代码显然依赖于Boost的ptree
,因此使用您的代码的任何人都必须安装Boost。如果您希望在未安装Boost时编译声明,则有以下几种选择:
ptree
/ #if
块)排除使用#endif
的位__has_include()
来测试<boost/property_tree/ptree.hpp>
是否存在,然后将其包括在内(如果存在),或者声明自己的ptree
如果它不存在&select {width: 100%;}
#39;吨