【问题标题】:Template classes & operator overloading模板类和运算符重载
【发布时间】:2012-02-07 03:15:41
【问题描述】:

如何重载如下模板类?

template <class T>
const_iterator& List<T>::const_iterator::operator++()
{
  current = current->next;
  return *this;
}

template <class T>
const_iterator List<T>::const_iterator::operator++(int)
{
  const_iterator old = *this;
  ++( *this );
  return old;
}

我收到如下错误:

List.cpp:17: error: expected constructor, destructor, or type conversion before ‘&’ token
List.cpp:23: error: expected constructor, destructor, or type conversion before ‘List’
List.cpp:30: error: expected constructor, destructor, or type conversion before ‘&’ token
List.cpp:35: error: expected constructor, destructor, or type conversion before ‘List’

【问题讨论】:

  • typename List&lt;T&gt;::const_iterator&amp; List&lt;T&gt;::const_iterator::operator++()

标签: c++ templates pass-by-reference class-template


【解决方案1】:
template <class T>
typename List<T>::const_iterator& List<T>::const_iterator::operator++()

在指定返回类型时,您不在List&lt;T&gt; 的所谓词法范围内。由于在封闭范围内没有类型 const_iterator,因此您会收到一个错误(尽管该错误可能会表现得更好一点,恕我直言)。

C++11 的另一个选项可能是尾随返回类型:

template<class T>
auto List<T>::const_iterator::operator++()
    -> const_iterator&
{
  // ...
}

然而,最好的办法是在类本身内联定义这些东西。您对课外定义有特殊原因吗?

【讨论】:

  • FWIW,所有 GCC 4.6、4.7 和 clang 3.1 都抱怨“const_iterator 不是类型”。看来 OP 正在使用 GCC 4.5。
  • 我正在使用 OSX 更新到的 GCC 版本。我不在课堂上搭建的原因是因为这是家庭作业的一部分。
  • 另外,在我等待能够接受这个作为答案的时候快速提问。我将如何以 T 作为类型来格式化这样的东西? template &lt;class T&gt; T&amp; List&lt;T&gt;::const_iterator::retrieve() { // return a reference to the corresponding element in the list. return current-&gt;data; }
  • @jordaninternets:你到底是什么意思?您的代码看起来不错,尽管我肯定会将其更改为T const&amp;,因为这就是const_iterator 的全部意义所在。 ;)
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-04-21
相关资源
最近更新 更多