模板类中的模板迭代器,clang不能推断模板形参

Template iterator inside template class, clang cannot infer template parameter

本文关键字:不能 形参 clang 迭代器      更新时间:2023-10-16

我有一个嵌套模板自定义迭代器的模板类(特化为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的每个特化创建一个非成员函数。据我所知,您不能在外部为这个非成员函数提供定义——它不是函数模板,而是每个专门化的适当函数。因此您只能在全局命名空间中定义一组固定的专门化。