首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Trait::<T>和<Trait<T>>有什么区别?

Trait::<T>和<Trait<T>>有什么区别?
EN

Stack Overflow用户
提问于 2019-12-02 14:14:35
回答 3查看 115关注 0票数 5

我有一个类型,它的方法可以通过

代码语言:javascript
复制
SomeTrait::<T>::method()

但我不明白这和

代码语言:javascript
复制
<SomeTrait<T>>::method()

在C++中,我希望这样做:

代码语言:javascript
复制
SomeTrait<T>::method()

这两个不一样吗?他们两人似乎都把<T>专门化称为method on SomeTrait

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-02 15:24:46

C++语法不能使用,因为它是Rust中的一个模糊语法:在SomeTrait<T>::method()中,第一个<是小于运算符,还是泛型参数列表的开头?

您所引用的两个方法用于消除这方面的歧义:

  • <SomeTrait<T>>被称为完全限定语法
  • SomeTrait::<T>被称为涡轮鱼符号(非官方名称)。
票数 5
EN

Stack Overflow用户

发布于 2019-12-02 15:20:00

SomeTrait::<T>::method()<SomeTrait<T>>::method()在锈蚀中是一样的。

只是风格上的选择。

票数 3
EN

Stack Overflow用户

发布于 2019-12-03 16:29:37

C++语法不明确。

解析C++中最大的挑战之一是能够区分使用<作为小于运算符或模板参数列表的开头。

大多数情况下,编译器通过“欺骗”来隐藏复杂性,C++解析器执行符号查找,以确定<左侧的任何内容是否是模板结构/方法。

在某些情况下,这种复杂性会显现出来;在模板中,在符号种类不明确的情况下,必须使用template关键字来区分:

代码语言:javascript
复制
foo.template get<T>()

生锈语法倾向于LL(1)

事后看来,这是Rust开发人员非常希望避免的一次黑客攻击。

因此,Rust中的相同表达式将为:foo.get::<T>()

为了保持一致性,对Foo::<T>::method()类型应用了相同的语法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59140724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档