我有一个带有嵌套模板自定义迭代器的模板类(专门用于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.
我做错了什么?如何正确实现模板类的自定义迭代器?
答案 0 :(得分:4)
可能最简单,最干净的解决方案是使用在类体内定义的非成员友元函数:
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
的每个专业化创建一个非成员函数。据我所知,你不能为这个非成员函数提供外部定义 - 它不是函数模板,而是每个特化的适当函数。因此,您只能在全局命名空间中定义一组固定的特化。