Visual studio 如何正确定义模板化类的成员结构的部分专门化?
尝试为模板化成员结构添加std::iterator_特征时出错-即,我有一个迭代器类,它是模板化外部类的成员:Visual studio 如何正确定义模板化类的成员结构的部分专门化?,visual-studio,templates,c++17,partial-specialization,Visual Studio,Templates,C++17,Partial Specialization,尝试为模板化成员结构添加std::iterator_特征时出错-即,我有一个迭代器类,它是模板化外部类的成员: namespace Toolbox { template <typename CharType> class substring_container_adapter { public: struct iterator // : public std::iterator<std::forward_iterator_tag,
namespace Toolbox {
template <typename CharType>
class substring_container_adapter
{
public:
struct iterator // : public std::iterator<std::forward_iterator_tag, const CharType *> C++ 17 is very upset at this approach!
{
// iterator constructor
iterator(const CharType * pszPosition, const CharType * pszDelimeters)
命名空间工具箱{
模板
类子字符串\u容器\u适配器
{
公众:
结构迭代器/ /:公共STD::迭代器C++ 17在这种方法中非常不安!
{
//迭代器构造函数
迭代器(常量图表类型*pszPosition,常量图表类型*pszDelimeters)
稍后,我尝试将迭代器特性的部分专门化添加到std中,因为从std::iterator继承显然是不可取的(尽管-or-or-boost::iterator_适配器非常有意义,并且实际上可以在这个和其他上下文中工作)
//为自定义迭代器定义迭代器特性
名称空间标准
{
模板
结构迭代器
{
使用迭代器\类别=前向迭代器\标记;
使用value_type=CharType;
};
}
然而,VC++2017版本15.7.3(本项目启用了C++17)抱怨:
错误C2764:“ChartType”:模板参数未在部分专门化“std::iterator\u traits::iterator>”中使用或可推断
为什么不呢
我怀疑这是!@#$恼人的限制,因为试图在子字符串容器适配器之外部分专门化成员结构而不是模板结构?这里正确的做法是将类型别名放在
迭代器中,而不是尝试部分专门化std::iterator\u traits
namespace Toolbox {
template <typename CharType>
class substring_container_adapter
{
public:
struct iterator // : public std::iterator<std::forward_iterator_tag, const CharType *> C++ 17 is very upset at this approach!
{
using iterator_category = forward_iterator_tag;
using value_type = const CharType *;
using reference = const CharType * &;
using pointer = const CharType * *;
using difference_type = std::ptrdiff_t;
// iterator constructor
iterator(value_type pszPosition, value_type pszDelimeters)
// ...
}
}
}
这里正确的做法是将类型别名放在iterator
中,而不是尝试部分专门化std::iterator\u traits
namespace Toolbox {
template <typename CharType>
class substring_container_adapter
{
public:
struct iterator // : public std::iterator<std::forward_iterator_tag, const CharType *> C++ 17 is very upset at this approach!
{
using iterator_category = forward_iterator_tag;
using value_type = const CharType *;
using reference = const CharType * &;
using pointer = const CharType * *;
using difference_type = std::ptrdiff_t;
// iterator constructor
iterator(value_type pszPosition, value_type pszDelimeters)
// ...
}
}
}
我认为您刚刚错过了将类关键字添加到结构迭代器中,您根本不需要这些部分模板专门化:)因为FWIW-添加更多类型名说明符不会改变事情(VS 2017)-同样的错误结果。似乎是语言的基本缺陷导致它无法处理模板内部类的部分规范构造(但我希望有人能在这里澄清)@VictorGubin我不知道这有什么帮助(目前)-因为概念仍然不是语言的一部分。请注意,您需要所有5个别名才能成为适当的std::iterator\u traits
,因此您在那里没有获得任何东西。我认为您只是错过了将class
关键字添加到struct iterator\u traits中,并且您根本不需要那些部分模板专门化:)自FWIW-添加以来更多typename
说明符不会改变事情(在VS 2017中)-同样的错误结果。似乎它基本上缺乏语言,无法处理模板内部类的部分规范构造(但我希望有人能在这里澄清)@VictorGubin我不知道这有什么帮助(目前)-因为概念仍然不是语言的一部分。请注意,您需要所有5个别名才能成为适当的std::iterator_traits
,因此您在那里没有获得任何东西。这看起来完全合理。但为什么会首选此选项(除了“它有效!”)我真的想声明我的迭代器类是迭代器的一种类型,而不是必须零碎地指定事情(感觉是错误的或任意的)顺便说一句,如果我继承了boost::iterator_adapter
,上面就是我得到的,我以前做过这个,因为上面的限制,而且在std
中没有类似的东西,请看一看谢谢。这是他们的推理,我个人认为这有点糟糕。就像我之前的评论一样,这只是一个任意的集合使用没有押韵和原因的声明(除了细节,我们都必须代表C++和标准体特质——BLUCH!)不去责备你——我明白知道“为什么”的清晰性——但是我会声明这是愚蠢的(纯粹的IMO)。)这是一个非常好的解决办法。我可能会将其作为答案。但我希望有人能澄清c++17中存在哪些限制,使得无法对模板的内部类型的std::iterator_traits进行部分专门化。这看起来完全合理。但为什么会首选它(除了“it works!”)我真的想声明我的迭代器类是迭代器的一种类型,而不是必须零碎地指定事情(感觉是错误的或任意的)顺便说一句,如果我继承了boost::iterator_adapter
,上面就是我得到的,我以前做过这个,因为上面的限制,而且在std
中没有类似的东西,请看一看谢谢。这是他们的推理,我个人认为这有点糟糕。就像我之前的评论一样,这只是一个任意的集合使用没有押韵和原因的声明(除了细节,我们都必须代表C++和标准体特质——BLUCH!)不去责备你——我明白知道“为什么”的清晰性——但是我会声明这是愚蠢的(纯粹的IMO)。这是一个非常好的解决方法。我可能会将其作为答案。但我希望有人能澄清c++17中存在的哪些限制,使得无法对模板内部类型的std::iterator_traits进行部分专门化。
namespace not_std {
template<class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct iterator {
using iterator_category = Category;
using value_type = T;
using difference_type = Distance;
using pointer = Pointer;
using reference = Reference;
};
}