给定一个带有嵌套 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/