问题标签 [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.
c++ - 从模板函数返回的 const 依赖名称,const 去哪里了?
假设我有一个模板函数(例如,foo
),它返回一个const
依赖类型。限定返回类型的选项const
是将 const 放在typename
关键字的左侧:
或在依赖类型的右侧:
但是如果我把const
限定符放在typename
关键字和依赖类型之间呢?
正如预期的那样,上面的代码无法为 GCC 和 CLANG 编译,但令我惊讶的是 VC++ 编译得很好。
问:
- 这是一个 VC++ 扩展吗?
- C++ 标准是否说明了在这样的上下文中放置
const
限定符的适当位置?
c++ - 条件运算符的返回类型和两阶段查找
考虑以下代码段:
在这种情况下,我认为应该在第一阶段查找对f
at的函数调用,因为它的参数类型是明确的,因此被解析为范围内唯一的类型。// 1
Derived&
f(Base&)
Clang 3.8.0 同意我的观点,但GCC 6.1.0 不同意,并将查找推迟f
到第二阶段,即在哪里f(Derived&)
被拾取。
哪个编译器是正确的?
c++ - 这是 MSVC 中依赖名称解析的错误吗?
在cppreference.com上,提供了以下代码作为解释依赖名称解析的示例:
当前版本的 Visual C++ (19.0.23918.0) 产生以下输出:
这是标准允许的,还是 MSVC 中的错误?
c++ - 朋友一个模板类的依赖类型名
我有 3 个类,Device
,Register
和WriteOnlyPolicy
, 定义如下:
设备
登记
只写策略
Register
并且WriteOnlyPolicy
从未在此方案中实际实例化,但我希望策略调用类的受保护writeDeviceRegister
函数Device
。我不希望该函数公开,因为我只想将该write
函数公开给该类的用户,而不是特定于设备的实现。
为了允许我想Device
成为朋友Register::access_policy
(在这种情况下,它是WriteOnlyPolicy
作为模板参数给出的类),但我无法弄清楚将模板类的依赖类型名作为朋友的语法。这可能吗?
我认为friend
在课堂上发表声明,Device
例如
会做的伎俩,但我得到了错误
错误:';'之前的预期不合格ID 令牌
c++ - 为什么即使模板类没有基类,`this` 也是类型相关的表达式?
以下代码可以无错误地编译:
而且我知道这是因为它this
是一个依赖于类型的表达式,这使得名称查找whatever
被推迟到知道实际的模板参数为止。由于在这种情况下从不使用成员函数f()
,因此不A<T>::f
存在的实例化,并且从不执行名称查找whatever
。
this
如果类模板具有类型相关的基础,我可以理解这是类型相关的,例如:
在解析模板类的定义时A
,不可能知道它的基类是什么类型,这this->whatever
可能是合法的(B<T>
可能有一个名为的成员whatever
)。相反,this->whatever
在第一个示例中,只要在f
某处使用成员函数,我就没有看到任何合法的潜力。
那么,this->whatever
在第一个例子中的某些时候可能是合法的吗?如果不是,在这种情况下是否还有其他原因this
应该被视为类型相关的表达式?
c++ - g++ 和 MSVS 之间的名称查找差异
考虑这段代码:
该代码旨在研究名称查找在 C++ 中的工作方式。
如果我用 GNU C++(6.1.0 版)编译这个程序,它会打印:
但如果我用 Microsoft Visual Studio 2015 编译它,它会打印:
哪个是正确的行为,为什么?
c++ - C++ 依赖名称:此类型名称是否必需?
在a.hpp
我定义:
然后,在b.cpp
我定义:
上面的代码可以在 gcc-6 和 clang-3.9 上编译而没有任何警告。然而,Clion 2016.3cannot resolve variable GroupNode
在b.cpp
. 取消注释typename
可以驯服 Clion 警告,但我想知道这是否typename
是必需的?如果是这样,为什么 g++/clang++ 没有发出任何警告?
c++ - 为什么我不能像 std::string::size_type 那样使用 QList::size_type?(模板参数错误)
在我的 for 循环中声明迭代器时研究无符号与有符号整数比较警告时,我读到了这个:
只要有可能,请使用您将与之比较的确切类型(例如,
std::string::size_type
与 astd::string
的长度进行比较时使用)。
我有一个QList<T>
我想迭代,使用上述方法声明迭代器:
它给了我一个编译器错误:
为什么我不能以同样的方式使用它?这是由我还是由 Qt 框架及其类型引起的?QList::size_type
在这种情况下,什么是好的替代品,QList::size()
只返回一个普通的旧的int
,我想使用它;但我阅读了上面链接的帖子,这让我不确定。
c++ - 嵌套模板类和全局命名空间中的函数
我正在研究模板 Graph 数据结构,它是 GraphNode 对象的 STL 向量。我定义了嵌套在 Graph 类中的 GraphNode 类,当我在 Graph 对象 Visual Studio 15 (C++) 报告的重载插入运算符内调用 GraphNode 对象的重载插入运算符时,
将单词 typename 添加到第二个形式参数
编译器生成以下错误
如果我 typename const .... 或 const typename ... 我会得到同样的错误
为了完整起见,这里的所有代码都为这篇文章做了一些简化。谢谢你的帮助
c++ - 从模板化函数中调用模板化类的模板化成员,带有显式参数
GCC 将A 行中的小于<
运算符视为B 行中的小于运算符。
是否有某种“宽松模式”,GCC 可以像 MSVC 那样处理 A 行,这样我就不必写了m.template f<1>(1)
?