名称查询似乎不适用于嵌套类

时间:2019-06-06 23:41:23

标签: c++ class nested declaration

我不知道为什么它不起作用。

template <typename E>
class SearchTree {
public:
    class Iterator {
             Iterator& operator++();
    };
};

template <typename E>
Iterator& SearchTree<E>::Iterator::operator++() {}
  

警告C4346:“迭代器”从属名称不是类型

     

错误C2061:语法错误:标识符“迭代器”

3 个答案:

答案 0 :(得分:3)

您可以使用尾随返回类型来解决此问题:

template <typename E>
auto SearchTree<E>::Iterator::operator++() -> Iterator& {}

在尾随返回类型中,类型可以在类的范围内。在SearchTree<E>::名称查找之前,看不到类内部。

答案 1 :(得分:2)

这是关于范围的问题。

使用

template <typename E>
Iterator& SearchTree<E>::Iterator::operator++() {}

当您将符号Iterator用作返回类型时,该类型在该范围内是未知的。您必须指定其范围:

template <typename E>
typename SearchTree<E>::Iterator& SearchTree<E>::Iterator::operator++() {}

如评论和其他答案中所述,您还可以使用跟踪返回类型。这是可能的,因为这样就知道了范围。


在相关说明上,以及为什么我为返回类型添加typename关键字,请参见Where and why do I have to put the “template” and “typename” keywords?

答案 2 :(得分:0)

您要完全指定返回值:

template <typename E>
SearchTree<E>::Iterator& SearchTree<E>::Iterator::operator++() {}