模板类中的模板迭代器,clang不能推断模板形参
Template iterator inside template class, clang cannot infer template parameter
我有一个嵌套模板自定义迭代器的模板类(特化为const/非const迭代器),如下所示:
template <typename T>
struct A
{
template <typename U>
struct AIterator
{
//...
};
typename AIterator<T*> iterator;
typename AIterator<const T*> const_iterator;
};
template <typename T>
bool operator==(const typename A<T>::iterator& lhs,
const typename A<T>::iterator& rhs,)
{
//...
}
template <typename T>
bool operator!=(const typename A<T>::iterator& lhs,
const typename A<T>::iterator& rhs,)
{
//...
}
//idem for const_iterator...
但是clang不能推断模板形参:
snake_test.cpp:17:68: error: invalid operands to binary expression ('wavelet::Snake<float>::const_iterator' (aka 'Iterator<const float *>') and 'const_iterator' (aka 'Iterator<const float *>'))
for (wavelet::Snake<float>::const_iterator it = snake.begin(); it != snake.end(); it++)
~~ ^ ~~~~~~~~~~~
./snake.hpp:150:6: note: candidate template ignored: couldn't infer template argument 'T'
bool operator!=(const typename Snake<T>::iterator& lhs,
^
./snake.hpp:164:6: note: candidate template ignored: couldn't infer template argument 'T'
bool operator!=(const typename Snake<T>::const_iterator& lhs,
^
1 error generated.
我做错了什么?如何正确实现模板类的自定义迭代器
可能最简单、最干净的解决方案是使用在类体内部定义的非成员友元函数:
template <typename T>
struct A
{
template <typename U>
struct AIterator
{
friend bool operator==(AIterator const& lhs, AIterator const& rhs)
{ /* implement here */ }
};
typename AIterator<T*> iterator;
typename AIterator<const T*> const_iterator;
};
这将为AIterator
的每个特化创建一个非成员函数。据我所知,您不能在外部为这个非成员函数提供定义——它不是函数模板,而是每个专门化的适当函数。因此您只能在全局命名空间中定义一组固定的专门化。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 使用作为模板形参提供的基类成员,不带限定符
- 部分专门化中不能推导模板形参
- const迭代器的模板形参,而不是迭代器
- c++形参是一个指向常量对象的指针,但不返回更新后的对象
- 类模板特化,c++,模板形参列表中参数2不匹配
- 在c++中真的不可能跳过带有默认实参的模板形参吗?为什么语法不这么认为?
- 模板类中的模板迭代器,clang不能推断模板形参
- 为什么c++中通过引用传递的形参不需要解引用操作符
- 为什么标准不允许在模板形参列表中初始化依赖于常量的类型
- 通过函数实参而不是模板形参获取元组的元素
- 在函数实参中使用模板形参不适用gcc4.8
- 不能在模板专门化定义中将一个类的成员类型定义用作模板形参
- 传递给构造函数的形参不是类型
- 在c++的形参中传递多个参数而不使用va_list
- 在c++中,如何重载操作符而不通过形参传递对象
- 为什么在形参中使用initializer_list而不是vector ?
- 在不调用initializer_list构造函数的情况下,将不可复制、不可移动的类型构造为函数形参
- 为什么不允许使用不同数量的模板形参的类/结构声明?
- 模板类复制构造函数形参,带或不带模板实参