【发布时间】:2014-06-28 12:07:05
【问题描述】:
我有一个带有嵌套模板自定义迭代器(专门用于 const/non-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.
我做错了什么?如何正确实现模板类的自定义迭代器?
【问题讨论】:
-
一方面,您的参考标签在您的论点的错误方面。例如:
lhs&应该是&lhs等。rhs参数后面的逗号也没有多大帮助。 -
谢谢!我在写这个问题时正在做饭,所以我写得很快,因此它可能会留下一些错别字。 ;-)
-
您是否尝试过在
A中定义operator==和operator!=? -
函数模板函数参数的嵌套名称说明符中的模板参数处于非推导上下文中。 IE。在
A<T>::iterator,T不能推导出来。 -
@matovitch 二元运算符(两个操作数)由于对称性而被实现为非成员函数。这允许 LHS 和 RHS 进行相同的转换(考虑
struct BigInt { BigInt(int); }; BigInt b; 42 == b)并且“更干净”,因为通常此类运算符无论如何都是可交换的,这意味着 LHS 和 RHS 具有相同的意义。
标签: c++ templates iterator clang++