【发布时间】: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<T>::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