问题标签 [dependent-name]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
111 浏览

c++ - 从模板函数返回的 const 依赖名称,const 去哪里了?

假设我有一个模板函数(例如,foo),它返回一个const依赖类型。限定返回类型的选项const是将 const 放在typename关键字的左侧:

或在依赖类型的右侧:

但是如果我把const限定符放在typename关键字和依赖类型之间呢?

正如预期的那样,上面的代码无法为 GCC 和 CLANG 编译,但令我惊讶的是 VC++ 编译得很好。

问:

  • 这是一个 VC++ 扩展吗?
  • C++ 标准是否说明了在这样的上下文中放置const限定符的适当位置?
0 投票
3 回答
1125 浏览

c++ - 条件运算符的返回类型和两阶段查找

考虑以下代码段:

在这种情况下,我认为应该在第一阶段查找对fat的函数调用,因为它的参数类型是明确的,因此被解析为范围内唯一的类型。// 1Derived&f(Base&)

Clang 3.8.0 同意我的观点,但GCC 6.1.0 不同意,并将查找推迟f到第二阶段,即在哪里f(Derived&)被拾取。

哪个编译器是正确的?

0 投票
1 回答
94 浏览

c++ - 这是 MSVC 中依赖名称解析的错误吗?

cppreference.com上,提供了以下代码作为解释依赖名称解析的示例:

当前版本的 Visual C++ (19.0.23918.0) 产生以下输出:

这是标准允许的,还是 MSVC 中的错误?

0 投票
0 回答
185 浏览

c++ - 朋友一个模板类的依赖类型名

我有 3 个类,Device,RegisterWriteOnlyPolicy, 定义如下:

设备

登记

只写策略

Register并且WriteOnlyPolicy从未在此方案中实际实例化,但我希望策略调用类的受保护writeDeviceRegister函数Device。我不希望该函数公开,因为我只想将该write函数公开给该类的用户,而不是特定于设备的实现。

为了允许我想Device成为朋友Register::access_policy(在这种情况下,它是WriteOnlyPolicy作为模板参数给出的类),但我无法弄清楚将模板类的依赖类型名作为朋友的语法。这可能吗?

我认为friend在课堂上发表声明,Device例如

会做的伎俩,但我得到了错误

错误:';'之前的预期不合格ID 令牌

0 投票
3 回答
311 浏览

c++ - 为什么即使模板类没有基类,`this` 也是类型相关的表达式?

以下代码可以无错误地编译:

而且我知道这是因为它this是一个依赖于类型的表达式,这使得名称查找whatever被推迟到知道实际的模板参数为止。由于在这种情况下从不使用成员函数f(),因此不A<T>::f存在的实例化,并且从不执​​行名称查找whatever

this如果类模板具有类型相关的基础,我可以理解这是类型相关的,例如:

在解析模板类的定义时A,不可能知道它的基类是什么类型,这this->whatever可能是合法的(B<T>可能有一个名为的成员whatever)。相反,this->whatever在第一个示例中,只要在f某处使用成员函数,我就没有看到任何合法的潜力。

那么,this->whatever在第一个例子中的某些时候可能是合法的吗?如果不是,在这种情况下是否还有其他原因this应该被视为类型相关的表达式?

0 投票
2 回答
588 浏览

c++ - g++ 和 MSVS 之间的名称查找差异

考虑这段代码:

该代码旨在研究名称查找在 C++ 中的工作方式。

如果我用 GNU C++(6.1.0 版)编译这个程序,它会打印:

但如果我用 Microsoft Visual Studio 2015 编译它,它会打印:

哪个是正确的行为,为什么?

0 投票
1 回答
281 浏览

c++ - C++ 依赖名称:此类型名称是否必需?

a.hpp我定义:

然后,在b.cpp我定义:

上面的代码可以在 gcc-6 和 clang-3.9 上编译而没有任何警告。然而,Clion 2016.3cannot resolve variable GroupNodeb.cpp. 取消注释typename可以驯服 Clion 警告,但我想知道这是否typename是必需的?如果是这样,为什么 g++/clang++ 没有发出任何警告?

0 投票
2 回答
191 浏览

c++ - 为什么我不能像 std::string::size_type 那样使用 QList::size_type?(模板参数错误)

在我的 for 循环中声明迭代器时研究无符号与有符号整数比较警告时,我读到了这个

只要有可能,请使用您将与之比较的确切类型(例如,std::string::size_type与 astd::string的长度进行比较时使用)。

我有一个QList<T>我想迭代,使用上述方法声明迭代器:

它给了我一个编译器错误:

为什么我不能以同样的方式使用它?这是由我还是由 Qt 框架及其类型引起的?QList::size_type在这种情况下,什么是好的替代品,QList::size()只返回一个普通的旧的int,我想使用它;但我阅读了上面链接的帖子,这让我不确定。

0 投票
2 回答
113 浏览

c++ - 嵌套模板类和全局命名空间中的函数

我正在研究模板 Graph 数据结构,它是 GraphNode 对象的 STL 向量。我定义了嵌套在 Graph 类中的 GraphNode 类,当我在 Graph 对象 Visual Studio 15 (C++) 报告的重载插入运算符内调用 GraphNode 对象的重载插入运算符时,

将单词 typename 添加到第二个形式参数

编译器生成以下错误

如果我 typename const .... 或 const typename ... 我会得到同样的错误

为了完整起见,这里的所有代码都为这篇文章做了一些简化。谢谢你的帮助

0 投票
0 回答
57 浏览

c++ - 从模板化函数中调用模板化类的模板化成员,带有显式参数

GCC 将A 行中的小于<运算符视为B 行中的小于运算符。

是否有某种“宽松模式”,GCC 可以像 MSVC 那样处理 A 行,这样我就不必写了m.template f<1>(1)