为什么返回类型中需要typename?C++
Why is typename necessary in return type? C++
给定一个带有嵌套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*
时,您已经确定您正在解析函数的声明,现在需要返回类型。
- 为什么返回类型中需要typename?C++
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 在这种情况下,"typename..."意味着什么?
- 为什么不需要在 C++20 中的依赖类型之前指定"typename"?
- "Cannot convert Python object argument to type '<typename>'" - 使用 Cython 包装 C++ 类时出错
- "typename"不应该只在模板函数或模板类中使用吗?
- C++ 中的"template <typename From, typename Tag> struct Alias;"是什么?
- 在C++中,我想通过使用来自变量(例如字符串)的typename信息,从模板中定义一个类对象
- 如何将一个使用参数包和typename的类作为函数(c++)的输入参数
- SFINAE的Typename关键字
- 为什么在以下情况下不需要为依赖类型使用typename
- 有什么技巧可以避免在模板类中使用"typename"关键字吗
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 为什么在VS2015中模板相关的嵌套类型名称中不需要typename关键字?
- (typedef)typename迭代器在c++、qt中不起作用
- 为什么嵌套类型的基类不需要"typename"?
- 比较函数模板中的 VARTYPE 和 typeid().name / typename
- "模板<typename>"是否合法C++?