为什么返回类型中需要typename?C++

Why is typename necessary in return type? C++

本文关键字:typename C++ 返回类型 为什么      更新时间:2023-10-16

给定一个带有嵌套Node结构的模板类Queue。

为什么这里的返回类型中需要typename?

template<typename T>
typename Queue<T>::Node* Queue<T>::test() {}

模板类Queue中的嵌套结构Node将在没有typename的Queue<T>::范围内。

根据Where and why do I have put the";模板";以及";typename";关键字?:

我们决定编译器应该如何解析它。如果t::x是依赖项name,然后我们需要用typename作为前缀来告诉编译器以某种方式解析它。

但我不明白为什么使用typename是合理的?

在解析返回类型(如问题中所定义(时,我们还不在Queue<T>的范围内。如果你要写,你的推理是正确的

template<typename T>
auto Queue<T>::test() -> Node* {
}

完全限定函数名的嵌套名称限定符使我们进入当前模板专用化的范围。在这里,非限定名称查找在当前专门化中找到Node*,已知它引用了一个类型。

但是,在解析问题中的返回类型时,编译器还没有遇到"当前特殊化",即Node*可以明确地假设为类型命名。它所看到的只是我们从一些专业化中编写一个依赖名称。因此,需要typename。这与我们必须编写没有什么不同

template<typename T>
typename OtherUnrelatedClass<T>::Node* Queue<T>::test() {
}

StoryTeller的答案是正确的。我想补充另一个观点。

在以经典函数形式解析Queue<T>::Node*时(如您的示例(,您还不知道您正在解析什么,也不知道您在解析函数的返回类型,这就是为什么您需要显式指定您有一个类型。(好吧,正如StoryTeller Down发布的链接中所示,你可以知道typename,但它需要更复杂的解析,即你需要提前扫描以确定你在函数声明中(。

但是在后缀返回类型中,当您到达Queue<T>::Node*时,您已经确定您正在解析函数的声明,现在需要返回类型。