- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在模板中,为什么必须在哪里以及为什么要将typename
和template
放在从属名称上?
无论如何,依赖名称到底是什么?
我有以下代码:
template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
// Q: where to add typename/template here?
typedef Tail::inUnion<U> dummy;
};
template< > struct inUnion<T> {
};
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
// ...
template<typename U> struct inUnion {
char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any U
};
template< > struct inUnion<T> {
};
};
typedef Tail::inUnion<U> dummy
行中。我相当确定
inUnion
是一个从属名称,而VC++恰好可以使它窒息。
template
来告诉编译器inUnion是一个模板ID。但是到底在哪里?然后是否应该假设inUnion是一个类模板,即
inUnion<U>
命名一个类型而不是一个函数?
最佳答案
(请参阅here also for my C++11 answer)
为了解析C++程序,编译器需要知道某些名称是否为类型。以下示例说明了这一点:
t * f;
t
的含义,以上内容可能会产生截然不同的解释。如果是类型,则它将是指针
f
的声明。但是,如果不是类型,它将是一个乘法。因此,C++标准在第(3/7)段中说:
Some names denote types or templates. In general, whenever a name is encountered it is necessary to determine whether that name denotes one of these entities before continuing to parse the program that contains it. The process that determines this is called name lookup.
t::x
引用模板类型参数,编译器将如何找出
t
引用的名称?
x
可以是一个静态的int数据成员,可以乘以,也可以是可以产生声明的嵌套类或typedef。
如果名称具有此属性-在知道实际的模板参数之前无法查找,则该名称称为从属名称(“取决于”模板参数)。
Let's wait until the user instantiates the template, and then later find out the real meaning of
t::x * f;
.
t::x
是从属名称,那么我们需要给它加上
typename
前缀,以告诉编译器以某种方式对其进行解析。标准在(14.6 / 2)中说:
A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
typename
,因为编译器可以使用模板定义中的适用名称查找来弄清楚如何解析结构本身-例如,当
T *f;
是类型模板参数时,使用
T
。但是要使
t::x * f;
成为声明,必须将其写为
typename t::x *f;
。如果省略关键字,并且名称被视为非类型,但是当实例化发现它表示类型时,编译器会发出通常的错误消息。有时,错误因此在定义时给出:
// t::x is taken as non-type, but as an expression the following misses an
// operator between the two names or a semicolon separating them.
t::x f;
typename
-因此,可以认为,已知非合格名称总是引用类型。
boost::function< int() > f;
boost::function
和
f
的任意定义:
namespace boost { int function = 0; }
int main() {
int f = 0;
boost::function< int() > f;
}
boost::function
与零(
int()
)进行比较,然后使用大于运算符将结果
bool
与
f
进行比较。但是,您可能知道,
boost::function
in real life是模板,因此编译器知道(14.2 / 3):
After name lookup (3.4) finds that a name is a template-name, if this name is followed by a <, the < is always taken as the beginning of a template-argument-list and never as a name followed by the less-than operator.
typename
相同的问题。如果在解析代码时我们还不知道名称是否是模板怎么办?根据
template
的指定,我们需要在模板名称之前插入
14.2/4
。看起来像:
t::template f<int>(); // call a function template
::
之后,而且可以出现在
->
或
.
之后。您也需要在其中插入关键字:
this->template f<int>(); // call a function template
T
)N
)(T)0
的转换)T[N]
是值相关的表达式或
N
是相关类型,则构造为
T
的类型是相关类型。有关详细信息,请参见
(14.6.2/1
)(用于依赖类型),
(14.6.2.2)
(用于类型依赖的表达式)和
(14.6.2.3)
(用于值依赖的表达式)。
T::x
,因此它也必须是从属名称(很幸运,从C++ 14开始,委员会已经开始研究如何解决这个令人困惑的定义)。
A name is a use of an identifier (2.11), operator-function-id (13.5), conversion-function-id (12.3.2), or template-id (14.2) that denotes an entity or label (6.6.4, 6.1)
operator +
和
operator type
形式。最后一种形式是
template-name <argument list>
。所有这些都是名称,按照标准中的常规用法,名称还可以包含限定符,该限定符表示应查找名称的 namespace 或类。
1 + N
不是名称,但
N
是名称。所有相关构造的子集即名称都称为相关名称。但是,函数名称在模板的不同实例中可能具有不同的含义,但是不幸的是,该通用规则没有捕获函数名称。
f((T)0)
中,
f
是从属名称。在标准中,这是在
(14.6.2/1)
处指定的。
typename
和
template
。您的代码应如下所示
template <typename T, typename Tail>
struct UnionNode : public Tail {
// ...
template<typename U> struct inUnion {
typedef typename Tail::template inUnion<U> dummy;
};
// ...
};
template
不一定总是出现在名称的最后部分。它可以出现在用作范围的类名的中间,如以下示例所示
typename t::template iterator<int>::value_type v;
typename
。假定给定的名称是类类型名称。对于基类列表和构造函数初始化器列表中的名称都是如此: template <typename T>
struct derive_from_Has_type : /* typename */ SomeBase<T>::type
{ };
template
之后使用::
,并且C++委员会said不能解决问题。 template <typename T>
struct derive_from_Has_type : SomeBase<T> {
using SomeBase<T>::template type; // error
using typename SomeBase<T>::type; // typename *is* allowed
};
关于c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56039652/
我感到困惑...... 我在 .jsp 中编写了一个小例程。最后需要关闭ResultSet、Statement和Connection。我也在finally { }中编写了结束代码,但是当页面运行时,它
我在 Stack Overflow 上读到一些 C 函数是“过时的”或“应该避免”。你能给我一些这种功能的例子以及原因吗? 这些功能有哪些替代方案? 我们可以安全地使用它们 - 有什么好的做法吗? 最
我正在构建一个应用程序,它可以拍照、显示图片,然后一旦被点击,就会在点击的任何地方返回图片的颜色。 它在崩溃之前到达了水龙头。我得到 x 必须是 < bitmap.width() 的错误 就我的理解而
我试图根据几个因素向用户提出建议: •建议只能是同一所大学的学生•建议必须至少匹配一个其他字段 我以为我有它,但问题是这个查询将返回同一所学校的所有学生,而不管其他情况: PUT /user/.per
我的应用程序必须从第三方读取 SSL 网址。我如何最好地将第三方凭证存储在我自己的数据库中,以保护第三方凭证不被泄露?兼顾绝对的安全性和实用性。对凭据进行单向哈希处理没有用,因为我必须将凭据恢复为明文
在我的 Rails API 中,我希望 Mongo 对象作为 JSON 字符串返回,Mongo UID 作为“id”属性而不是“_id”对象。 我希望我的 API 返回以下 JSON: { "
假设应用层协议(protocol)是通过UDP实现的。客户端需要超时,因此服务器需要保留与其通信的每个客户端的状态。 还假设使用了select。 实现多线程服务器总是最好的吗?我认为链接列表也会做同样
考虑一个非常短的程序,我在其中分配了一点内存。我被告知,GC 在程序分配大量内存并且分配达到限制的情况下运行。 我不知道这个限制到底是多少,但我认为它必须足够高,这样 GC 才不会频繁运行并减慢程序的
根据 Cocoa with Love当应用程序需要 WiFi(而不是蜂窝网络)时需要可达性,例如如果应用加载大量视频并且不适合在 3G 网络上使用。 我的应用程序使用互联网,无论是 WiFi 还是 3
我正在寻找更好的解决方案来解决我面临的这个问题。 如果您将鼠标悬停在缩略图上,它会淡出较大的镜头并淡入新的镜头,这很好,但是当转到目标缩略图并且您的鼠标再悬停一些时,它会更改为您的鼠标经过并拍摄的其他
启用 UAC 并使用管理帐户登录后,您将获得两个 token : 提升的 token ;这已启用 Administrators 组,具有高完整性(即强制性完整性标签 SID 为 S-1-16-1228
我想知道在 React 中创建动态选择组件的规范方法是什么。我是否必须创建一个单独的组件来根据下面的代码返回选项,以便能够通过每个条目的 props 自定义值,然后将它们包含到单独的选择组件中? p>
我有一个启用了分页的数据网格。我根据过滤条件在数据网格中显示结果。我已经过滤了数据,现在有 2 页。当我转到第二页时。我正在再次执行搜索功能以缩小结果范围。然后我收到类似“无效的 CurrentPag
我有原始文本列,其值类似于“2012-07-26T10:33:34”和“2012-07-26T10:56:16”。在使用 Joda-Time 的 Java 中,我可以通过调用 轻松地将其转换为日期/从
您好,我被分配了一项棘手的任务。我需要让一个方形 div 到达顶部的一个点。基本上它看起来像一个正方形 div,顶部有一个宽三 Angular 形。请参阅下面的屏幕截图。顶部的深蓝色只是堆叠在白色 d
我想知道,为什么我们在 android 中使用不同的启动器图标(大小)。目前您“必须”将图标大小调整为: LDPI - 36 x 36 MDPI - 48 x 48 HDPI - 72 x 72 XH
在 SO 的几个地方,声称必须知道对象的确切类型并基于此做出决定(以 if-then-else 方式)指向一个设计缺陷,例如here . 我想知道是否总是如此。在当前的一个小型教育项目(我正在使用它来
据我了解,迭代器是一种为客户端提供接口(interface)以观察/迭代/传递自定义集合等内容的机制,而不破坏信息隐藏原则。 STL 容器有自己的迭代器,所以我们可以毫无问题地对它们使用 for (
我在 Golang 中编写了一个包装函数,用于从多个文件中渲染模板,如下所示: func RenderTemplate(w http.ResponseWriter, data interface{},
据我了解,size_type 和 difference_type 的目的不仅仅是符号——它也是为了解决例如分段架构等,它们可能具有不同的大小。 在这种情况下,如果我有一个带有随机访问迭代器的容器,那么
我是一名优秀的程序员,十分优秀!