如何转发声明已在其他地方转发声明为默认值的模板类型
How do I forward declare a template type that has been forward declared elsewhere with a defaulting
所以对 的出色回答表明您可以在前向声明中默认模板类型,但是:
You can specify each default template argument only once
这在链接的问题中有更完整的说明,但是 Boost 的 属性 Tree 东西适用于 ptree
类型:
typedef basic_ptree<std::string, std::string> ptree;
但是 basic_ptree
class 是这样定义的:
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
。但我不想在我的 headers 中包含 Boost
。这意味着我必须提前申报。 但是我无法匹配默认的前向声明,因为默认只能声明一次。
如何编写依赖于另一个 headers 前向声明中的默认设置的前向声明和前向类型定义?
我目前正在这样做,但这意味着我不是 转发typedef
,我正在制作一个新 typedef
:
template <class Key, class Data, class KeyCompare> class basic_ptree;
typedef basic_ptree<std::string, std::string, std::less<std::string>> ptree;
为了保持一致性,我想依赖与原始 ptree
typedef
所依赖的 basic_ptree
相同的默认前向声明。
简短的回答是你不能。您要么必须以某种方式保证永远不会包含其他声明,以便您可以指定自己的默认值,要么您需要依赖于其他声明。
但我觉得这是一个 XY problem,因为以下语句:
But I don't want to include Boost in my headers.
为什么不呢?您的代码显然依赖于 Boost 的 ptree
,因此任何使用您的代码的人都必须安装 Boost。如果你希望你的声明在没有安装 Boost 时也能编译,有几个选项:
- 确保使用预处理器指令排除使用
ptree
的位(#if
/#endif
块)
- 使用 C++17 的
__has_include()
来测试 <boost/property_tree/ptree.hpp>
是否存在,如果存在则包含它,如果不存在则声明你自己的 ptree
.
所以对
You can specify each default template argument only once
这在链接的问题中有更完整的说明,但是 Boost 的 属性 Tree 东西适用于 ptree
类型:
typedef basic_ptree<std::string, std::string> ptree;
但是 basic_ptree
class 是这样定义的:
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
。但我不想在我的 headers 中包含 Boost
。这意味着我必须提前申报。 但是我无法匹配默认的前向声明,因为默认只能声明一次。
如何编写依赖于另一个 headers 前向声明中的默认设置的前向声明和前向类型定义?
我目前正在这样做,但这意味着我不是 转发typedef
,我正在制作一个新 typedef
:
template <class Key, class Data, class KeyCompare> class basic_ptree;
typedef basic_ptree<std::string, std::string, std::less<std::string>> ptree;
为了保持一致性,我想依赖与原始 ptree
typedef
所依赖的 basic_ptree
相同的默认前向声明。
简短的回答是你不能。您要么必须以某种方式保证永远不会包含其他声明,以便您可以指定自己的默认值,要么您需要依赖于其他声明。
但我觉得这是一个 XY problem,因为以下语句:
But I don't want to include Boost in my headers.
为什么不呢?您的代码显然依赖于 Boost 的 ptree
,因此任何使用您的代码的人都必须安装 Boost。如果你希望你的声明在没有安装 Boost 时也能编译,有几个选项:
- 确保使用预处理器指令排除使用
ptree
的位(#if
/#endif
块) - 使用 C++17 的
__has_include()
来测试<boost/property_tree/ptree.hpp>
是否存在,如果存在则包含它,如果不存在则声明你自己的ptree
.