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

csg*_*guy 4 c++ templates typename

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

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

template<typename T>
typename Queue<T>::Node* Queue<T>::test() {}
Run Code Online (Sandbox Code Playgroud)

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

根据我在哪里以及为什么必须放置“模板”和“类型名称”关键字?

我们决定编译器应该如何解析它。如果 t::x 是一个依赖名称,那么我们需要在它前面加上 typename 前缀以告诉编译器以某种方式解析它。

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

Sto*_*ica 7

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

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

}
Run Code Online (Sandbox Code Playgroud)

完全限定函数名称的嵌套名称限定符将我们置于当前模板特化的范围内。此处非限定名称查找Node*在当前专业化中查找,已知引用类型。

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

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

}
Run Code Online (Sandbox Code Playgroud)

  • @csguy - 这只是迄今为止的定义方式。与可能产生歧义的地方保持一致的问题。不过,你的推论也并非没有道理。这样的推理就是为什么在 C++20 中对此进行了更改。我们不再需要在返回类型中编写太多的 typename 。请参阅[使用类型名称](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0634r1.html)。 (4认同)