【问题标题】:Aliasing a nested class of a template给模板的嵌套类起别名
【发布时间】:2022-01-23 23:37:53
【问题描述】:

我在头文件中有以下内容:

template <typename T>
class RingDeque {
  ...
  struct Iterator {
    using reference = T&;
    reference operator*() const;
  }
}

我想在 cpp 文件中实现operator*() 函数。我目前在 cpp 文件中有以下内容:

template <typename T>
typename RingDeque<T>::Iterator::reference RingDeque<T>::Iterator::operator*()
    const {
  ... some implementation
}

无论如何我可以将类型别名为RingDeque&lt;T&gt;::Iterator 吗?也许是这样的?

template <typename T>
using MyIterator = RingDeque<T>::Iterator;
template <typename T>
MyIterator::reference MyIterator::operator*()
    const {
  ... some implementation
}

我已经尝试了很多变体,但我无法在方法的实现中替换类型。例如,使用以下代码:

template <typename T>
using MyIterator = typename RingDeque<T>::Iterator;

template <typename T>
RingDeque<T>::Iterator::reference MyIterator::operator*() const {
  return this->_data[0];
}

我收到以下错误消息:

ringDeque.cpp:49:1: error: missing 'typename' prior to dependent type name 'RingDeque<T>::Iterator::reference'
RingDeque<T>::Iterator::reference MyIterator::operator*() const {
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
typename 
ringDeque.cpp:49:35: error: 'MyIterator' is not a class, namespace, or enumeration
RingDeque<T>::Iterator::reference MyIterator::operator*() const {
                                  ^
ringDeque.cpp:46:1: note: 'MyIterator' declared here
using MyIterator = typename RingDeque<T>::Iterator;
^
2 errors generated.

【问题讨论】:

  • 无论如何你都不应该在 cpp 文件中实现模板。另外,请显示您收到的确切错误消息。
  • 您当然可以为嵌套类型创建别名模板。不知何故,我认为这不是你真正要问的。您想定义operator* 而不将大多数类型重复两次?
  • 基本上,是的。查看最近的编辑。
  • @cigien 这些方法会有不平凡的实现,为什么不去cpp文件呢?

标签: c++ templates alias inner-classes type-alias


【解决方案1】:

我将只使用尾随返回类型并完成它。

template <typename T>
auto RingDeque<T>::Iterator::operator*() const -> reference {
  //... some implementation
}

如果你真的想使用别名模板,那么你一定不要忘记它也是,顾名思义,就是一个模板。

template <typename T>
using MyIterator = RingDeque<T>::Iterator;
template <typename T>
typename MyIterator<T>::reference RingDeque<T>::Iterator::operator*()
    const {
  //... some implementation
}

【讨论】:

  • typename 添加到模板别名后,我得到以下信息: ringDeque.cpp:48:50: error: nested name specifier 'MyIterator::' for declaration does not引用类、类模板或类模板偏特化类型名 MyIterator::reference MyIterator::operator*() const {
  • @Poseidon23 - 这种疏忽很容易解决,我做到了。但不要将 SO 误认为是通过通信进行的免费交互式调试会话。我只会解决您在问题中发布的内容,而不是在 cmets 中。
  • 知道了。为什么不能用模板别名替换第二个RingDeque&lt;T&gt;::Iterator
  • @Poseidon23 - 声明匹配的语言规则。该错误提到了编译器在那里的预期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多