问题标签 [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++ - Clang 访问修饰符顺序和 decltype
我一直在考虑创建一个同步器帮助器模板类,它基于 Herb Sutter 在本次演讲中关于包装器类的想法这在 msvc 中不起作用(除非我们删除大括号初始化)但是当大括号初始化被删除时就可以了.
在 clang/gcc (ubuntu 12.10, gcc4.7.2, clang (3.2) self built with libc++) 中,私有访问修饰符似乎必须出现在公众面前:这似乎有点奇怪。
gcc 中的错误是
error: ‘t_’ was not declared in this scope
铿锵是
这可能是我不知道的模板/declytpe 问题,并且想知道是否有人可以帮助解决这个问题。(全部使用相关的 c++11 标志编译)
编辑:添加约翰内斯的想法和全班,以防有人想要剪切和粘贴。
c++ - 具有可变参数模板的依赖类型
你能看出这个函数声明有什么问题吗?
当我尝试调用它时,如下所示:
MSVC2013 说error C2027: use of undefined type 'std::tuple<Containers::value_type>
。
我尝试使用“延迟返回”语法重写函数声明,但没有任何区别。
有什么方法可以实现这段代码想要做的事情吗?
c++ - 具有可变参数模板的更多依赖类型
这是昨天的问题,我提供了一些 Visual Studio 2013 无法处理的 C++ 代码,@galop1n 提供了一个解决方法,它非常适合这种情况。但现在我已经走得更远了,Visual Studio 又让我伤心了。
每当我尝试实例化函数模板 foo 或类模板 Foo 时,都会收到以下两条消息:
Test.cpp(21): error C3546: '...' : 没有可扩展的参数包
和
Test.cpp(21): error C3203: 'ValueType' : unspecialized alias template can't be used as a template argument for template parameter '_Types', 应为真实类型
在每种情况下(实例化 foo 或实例化 Foo),两条消息都指向定义“x”的行。
更新:我的Microsoft 错误报告现在(在其附件中)包含此问题的所有基本变体。所以这将是寻找修复的地方。
c++ - 如果将依赖名称用作模板参数,是否需要使用 typename 限定依赖名称?
MSVC 接受此代码,没有错误或警告。标准对此有何规定?在上面的示例中,我们是否允许(可选)、不允许(禁止)或要求(强制)使用 typename 限定 T::iterator?我对 C++03 规则特别感兴趣,尽管如果 11 有任何变化,我很高兴知道。谢谢你。
c++ - 为什么数据成员的模板函数只有在符合“this”条件时才是依赖名称?
这段代码编译得很好(在 GCC 4.7 中),但如果我在调用前bar.baz<int>()
加上 with this->
,baz
就会变成一个需要用 消除歧义的依赖名称template
。
肯定this->bar
只能指Bar bar
,谁的成员baz
明明是模板?为什么添加this->
会使此代码对编译器产生歧义?
ps 最初,bar
它是需要用 消除歧义的基类模板的数据成员this->
,但为了解决这个问题,我已经简化了示例。
c - 创建新文件,其名称取决于程序中的变量
我正在尝试编写一个程序来保存“X”个简单文本文件 - 但是,一旦程序运行,X 由用户确定。我似乎在网上找不到任何关于如何解决以下两件事的帮助,所以任何提示将不胜感激!
1)如果我不知道会有多少,我如何在程序开始时声明这些文本文件?
到目前为止,我习惯使用:
/li>但我真正需要的是:
/li>想到的解决方案看起来像一个循环,但我知道这行不通!
/li>
2)我如何命名它们?
我想称它们为简单的名称,例如“textfile_1,textfile_2”等,但我不知道如何使用:
/li>再一次,我想也许会做一个循环(?!),但我知道这行不通:
/li>
在运行程序之前绝对无法知道变量“X”是什么。
编辑:问题已解决-我不知道您可以创建“FILE *”数组,感谢您的帮助!
c++ - 仅专门化嵌套模板
我有以下模板:
专业化示例:
这是两个类同时专业化的情况。但是有可能只专攻二等吗?
就像是:
(是的,我还需要第二个参数成为第一个参数的内部类。)
c++ - 实例化点后 ADL 未找到最佳匹配。这是UB吗?
考虑下面的代码,其中重载的位置f
会导致一些非直观的行为。该代码在 Clang 3.4.1 和 gcc 4.8 中编译时都没有警告。
C++11 标准建议上述代码调用未定义的行为:
[temp.dep.candidate]
对于依赖于模板参数的函数调用,使用通常的查找规则找到候选函数,除了:
- 对于使用非限定名查找或限定名查找的查找部分,仅找到来自模板定义上下文的函数声明。
- 对于使用关联名称空间的查找部分,仅找到在模板定义上下文或模板实例化上下文中找到的函数声明。
如果函数名称是非限定 ID,并且调用格式错误或找到更好的匹配,则在关联命名空间中的查找考虑所有翻译单元中在这些命名空间中引入的具有外部链接的所有函数声明,而不仅仅是考虑在模板定义和模板实例化上下文中找到的那些声明,则程序具有未定义的行为。
上面的代码是否调用了这个特定的未定义行为?是否可以期望高质量的实施报告警告?
c++ - 具有依赖限定 ID 的类成员 using-declaration 是否应该是依赖名称?
C++11 标准草案 N3337 在[namespace.udecl]
using-declaration 将名称引入到 using-declaration 出现的声明性区域中。
每个 using-declaration 都是一个声明和一个成员声明,因此可以在类定义中使用。
在用作成员声明的 using-declaration 中,nested-name-specifier 应命名正在定义的类的基类。
这通常用于在派生类中使基类中的受保护类型定义为公共,如下例所示,该示例在最新版本的 Clang 中成功编译:
using-declaration 可以引用模板类。这编译:
也可以在依赖基类中引用模板。以下编译成功(带有 typedef 注释。)
实例化时取消注释typename
会导致错误B<int>
:“错误:在非类型上使用'typename'关键字”。
B
在第一次实例化之前解析 typedef 时,取消注释会导致错误。我猜这是因为编译器不将Type
其视为依赖类型名称。
最后一段[namespace.udecl]
建议 using-declarations 可以指定依赖名称,并且typename
必须使用关键字来消除对引入名称的进一步使用的歧义:
如果 using-declaration 使用关键字 typename 并指定依赖名称 (14.6.2),则 using-declaration 引入的名称被视为 typedef-name
我的阅读[temp.dep]
表明这A<T>::Type
是一个从属名称。从逻辑上讲,使用声明引入的名称也应该是依赖的,但[temp.dep]
没有明确提及依赖使用声明的情况。我错过了什么吗?
c++ - 派生模板类对基类成员数据的访问:用于依赖名称
在下面一长串代码中,请寻找三个地方:
// "this->" can be omitted before first data[0]
和
// Compile error, if "this->" is omitted before first data[0]
和
// likewise, "this->" is required.
我不知道为什么有时“this->”可以省略,有时不能。
编译错误是:main.cpp:19:3: error: 'data' was not declared in this scope
它只是一个编译器错误吗?我的编译器是 GCC v4.8.1 和 v4.8.2。谢谢。顺便说一句,QtCreator 的默认智能感知,事实上,在所有三个地方都可以识别没有“this->”的 'data[0]'。
这是代码列表:
== 更新 ==
由于有人指出了一个非常相似的问题(可能是重复的)和答案,并且该问题的标题甚至是描述性的,我将我的标题更改为与那个相似的标题(除了参数依赖差异)
然而,在阅读了该问题的答案后,我仍然感到困惑。答案指向一个常见问题[link here]说如果变量是非依赖名称,编译器将不会在基本模板类中搜索名称。然而,在这个例子中,变量 ( data
) 是一个从属名称,因为它的类型是T
,并且T
是模板变量。
我仍然愿意接受答案。