问题标签 [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++ - 如果函数类型仅依赖于它自己的模板参数,那么它是否依赖于它?
我遇到了当前 C++ 编译器(clang/gcc)确定名称是否依赖的方式不一致。在下面的示例中,A::f
是依赖但::f
不是,使用后者时会导致错误。
不一致的部分是声明A::f
不依赖于的模板参数A
,这意味着似乎没有必要将其视为依赖名称。
C++11 标准中的以下措辞似乎涵盖了此行为:
[temp.dep.expr]/3
一个 id 表达式是依赖于类型的,如果它包含
- 一个标识符,通过名称查找与一个或多个用依赖类型声明的声明关联
[温度.dep.type]/3
一个类型是依赖的,如果它是
- 从任何依赖类型构造的复合类型
的声明::f
显然不依赖,因为它的类型只依赖于它自己的模板参数。为什么要A::f
区别对待?
c++ - typename 关键字和嵌套名称说明符
为什么第一种情况正确,而第二种情况不正确?我不明白这个限制的含义。
无论如何,为什么允许第一种情况?::A
不是模板参数依赖名称。其中有什么意义?
c++ - 编译器将(不相关)模板的名称与方法名称混淆
我在以下代码中有编译错误。似乎编译器将类方法解释set
为模板 - 乍一看 - 与我的代码完全无关。
编译器给出以下错误:
但我认为这是因为它认为这set
是一个模板:
我不明白为什么编译器会尝试为方法实例化该模板,set
而不仅仅是调用方法set
。如何解决这种名称混淆?
c++ - static_assert 依赖于非类型模板参数(gcc 和 clang 的不同行为)
在尝试禁用通用模板实例化时,static_assert
我发现clang
即使模板未实例化,上述代码也会生成断言错误,而gcc
仅在Hitchhiker
使用42
.
摆弄我发现这个断言:
在两个编译器上的行为相同:断言仅在通用模板被实例化时才生效。
标准是怎么说的,哪个编译器是正确的?
c++ - 再次关于 typename 和 template 关键字
我已经仔细阅读了许多关于这个主题的答案,但是我无法确切地知道这两个关键字何时在嵌套模板类的成员的非模板函数的范围内是或不需要的。
我的参考编译器是 GNU g++ 4.9.2 和 clang 3.5.0。
它们在以下代码中的行为几乎没有什么不同,我在其中放置了嵌入式注释以试图解释发生了什么。
那么,在范围内f
是Pa<double>::Pe<BBB>
不是依赖名呢?
那么Pa<AAA>::Pe<int>
呢?
毕竟,为什么这两个引用的编译器会有这种不同的行为呢?
任何人都可以澄清解决这个难题吗?
c++ - 允许 `this->` 访问依赖基类成员的规则是什么?
众所周知,下面的代码格式错误,因为该成员x
位于依赖基类中。但是,更改x
为this->x
指示的行将修复错误。
我想解释一下标准中如何指定这种行为。根据 [temp.dep]/3:
在类或类模板的定义中,如果基类依赖于模板参数,则在非限定名称查找期间,无论是在类模板或成员的定义点还是在类模板或成员的实例化期间,都不会检查基类范围类模板或成员。
这似乎解释了为什么x
单独使用会失败。x
在定义点查找名称,不检查基类范围。但是,如果我们使用this->x
? 现在名称x
是依赖的,它的查找被推迟到实例化。但是引用的段落似乎暗示即使在实例化时x
也不应该找到,因为in的查找仍然是不合格的查找。x
this->x
显然,实现不会以这种方式运行,并且人们普遍认为,一旦模板被实例化,就会搜索基类范围。
- 我是否误解了引用的段落?
- 是否有一段指定“正确”行为的段落?
c++ - 等效于“typename”,表示依赖名称确实是“模板模板参数”
我们将无法找到正确语法的部分代码缩减为最小示例。
让我们假设以下定义(不要担心“为什么”;)
现在,从 C++11 开始,我们可以使用类模板或类型别名模板来实例化Client
模板。以下函数编译得很好:
Client
但是当给定的模板参数是从属名称时,我们无法在以下情况下找到正确的语法:
Clang(用 3.6 测试)发出以下编译错误:
我们可以修复这个语法吗?
c++ - 从模板化基类中取消隐藏模板化强制转换运算符
我有一个带有模板转换运算符的模板基类。我想在派生类中取消隐藏这个模板化转换运算符(因为依赖名称查找)。
有没有办法做到这一点?上面的代码不起作用,因为它告诉我不能模板化 using 声明。
c++ - Using variables from parent class
I've been trying to use template to implement stack. And my question is how do I use the variables from the parent class in this situation?
In this case my compile error is: 'top, a, size' was not declared in this scope.
c++ - 计算函数指针的类型
考虑以下:
这适用于:
Widget::foo()
一些功能在哪里
我将如何修改 的定义struct S
以允许以下内容: