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

标签 c++ templates typename

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

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

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

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

根据Where and why do I have to put the "template" and "typename" keywords? :

We decide how the compiler should parse this. If t::x is a dependent name, then we need to prefix it by typename to tell the compiler to parse it in a certain way.

但我不明白为什么使用类型名是合理的?

最佳答案

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

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

}

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

但是在解析问题中的返回类型时,编译器尚未遇到“当前特化”,其中 Node*可以明确地假设为命名类型。它所看到的只是我们编写某些特化的依赖名称。因此,typename是必须的。这和我们必须写没有什么不同

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

}

关于c++ - 为什么返回类型中需要 typename ? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60277129/

相关文章:

c++ - 按键排序 std::unordered_map

c++ - 将 3D MatND 拆分为 2D Mat opencv 的 vector

html - Go 模板中的排序映射迭代?

codeigniter - 这是在 CodeIgniter 中使用 Controller 和 View 的好方法吗?

c++ - 仅专门化嵌套模板

c++ - 在这个例子中是否需要重载的 operator= ?

c++ - 通过同一命名空间中的另一个类型访问类型

templates - 如何根据 symfony2 上登录的用户角色呈现动态菜单

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

c++ - 这里是否需要类型名称?