- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我尝试查阅标准关于do_run的解析,发现“对于使用不合格名称查找(3.4.1)或合格名称查找(3.4.3)的查找部分,只有找到模板定义上下文中的函数声明”。上下文到底是什么?
在下面的示例中,do_run(int)
以某种方式“隐藏”了 do_run(domain::mystruct)
,并且编译器提示说 o 不能转换为 int
。如果我注释掉 do_run(int)
,do_run(domain::mystruct)
对 run
可见,并且代码被编译。这种行为是否与标准中提到的“上下文”有关?在我看来 do_run(int)
和 do_run(domain::mystruct)
应该对(可解析的)运行可见。
namespace domain {
struct mystruct { };
}
void do_run(domain::mystruct) { cout << "do_run(domain::mystruct)" << endl; }
namespace lib { namespace details {
template <class T>
class runner {
public:
void run(T t) { do_run(t); }
};
void do_run(int) { cout << "do_run(int)" << endl; }
}}
int main() {
domain::mystruct o;
lib::details::runner<domain::mystruct> r;
r.run(o);
return 0;
}
在 do_run(int)
存在的情况下,我需要一个额外的步骤将 do_run(domain::mystruct)
带入“上下文”。三种方式:
do_run(domain::mystruct)
放入命名空间域。do_run(domain::mystruct)
放入命名空间 lib::details 中。using::do_run
。所以我推断上下文是命名空间 lib::details 和命名空间域?
编译器VS2010
最佳答案
查找取决于它是否是从属名称。由于您的函数调用取决于模板参数类型 T
(通过使用此类型的对象 t
来调用),它是一个从属名称。
仅在定义模板的上下文中查找非依赖名称。与实际实例化相关的任何事情都没有被考虑在内:由于名称被确定为不依赖于模板参数,因此将实例化考虑在内是没有意义的。这是第一阶段查找。
在考虑实例化的情况下查找相关函数名称。这使用所有参数并确定关联的命名空间以仅在这些关联的命名空间中查找函数。对于内置类型,添加的关联命名空间是全局命名空间。对于其他类型,添加的关联命名空间是它们所在的命名空间加上所有封闭的命名空间。此外,还添加了从类定义中可见的事物的关联命名空间:基类的关联命名空间,对于模板,模板参数的命名空间等。这是第二阶段查找,也称为参数依赖查找-up(当然,我认为术语并不完全相同,细节也不像上面描述的那么简单)。
在您引用的代码中,do_run()
显然,全局范围内的函数是为 lib::details::runner<domain::mystruct>
找到的因为它在全局命名空间中。如果将其移动到 domain
也会被发现. do_run()
命名空间中的方法 lib::details
在实例化中未找到lib::details::runner<int>
,但是:int
的关联命名空间只是全局命名空间,但函数不存在,并且直到实例化时才会查找它,因为它是一个从属名称。
也就是说,我的理解是 MSVC++ 没有按照指定的方式实现两阶段名称查找,但我不知道它偏离了哪些方式。
关于c++:模板中非限定名称查找的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501598/
在 Haskell 中,我可以导入由其名称或快捷方式名称限定的模块,如下所示: import qualified Data.List as List import qualified Data.Map
我在头文件中有以下函数声明: extern void flash(const char *message, const enum msg_type type); 基本上,它有两个参数并将相应的消息推送
我遇到了一个我似乎无法理解的小问题。 我正在我的数据库中搜索一个用户一个月内收到的评论总数,然后绘制成图表。 我遇到的问题是在我的 SQL 语句中使用 MONTHNAME 如果我使用 $this->d
根据 this answer , 常量不应该被删除,因为它们可能一开始就没有分配。但是,在某些情况下我想保护动态分配的数据。例如,在管理用户 session 时†,我想确保像当前用户名这样的数据不会被
我正在处理一个大型 C++ 项目。我有一堆在项目的子集中使用的宏,但我不想将它们导出到任何地方,以避免污染不相关的代码。 现在,我的许多文件看起来像 #include // defines MACR
谁能解释为什么代码无法编译。 template struct Base { T a; Base(const T argB) : a(argB){} }; template struct Der
我正在阅读 C++-Primer(作者:Josée Lajoie 和 Stanley B. Lippman),这时我看到了有关顶级和低级 const 的部分。在一段中,它说当复制对象时,顶级 cons
我有一大块 CSS,我想将其“作用域”到特定的 HTML block 。我正在生成一个唯一的 ID,然后将其设置在 HTML block 上,然后想用相同的 ID 包装 CSS block ,以便这些
我正在尝试为接受三个参数的函数创建一个通用接口(interface)。填写第一个参数时,第二个参数的选项应该在第一个参数的范围内。第三个参数应该在第二个参数的范围内。 我当前的代码如下所示: type
似乎 C++11 和 C++14 对待纯右值的 cv 限定不同。 C++11 坚持自 C++98 以来一直存在的“经典”方法:根据 3.10/4 “非类纯右值始终具有 cv 非限定类型”。 C++14
这个问题在这里已经有了答案: Stripping all qualifiers from a function type (1 个回答) 关闭去年。 我想编写一个模板,它接受一个指向成员函数的指针(
有时在引用同一类(或基类)的其他实例成员的实例成员中阅读代码可能会造成混淆: public void MyMethod() { Where = did + AllTheseWeirdThing
因此,在使用 constexpr 时,MSVC (Visual Studio 2012) 在尝试使用这个简单的程序(包括省略)使用 constexpr 关键字限定我的函数时给了我一个错误: const
这是我的 html(在 Twig 模板中) {{folder.name}} 我正在尝试从“data-jstree”获取“type”的值。 我试过用 var node_id = ref.get_node
当我尝试编译以下函数时出现错误。 string& foo(){ return "Hello World"; } Error: 1 IntelliSense: a reference of type
我有以下情况: 一个函数创建一个字符串数组,然后将其传递给一堆其他函数。这些其他函数不应修改外部指针指向的指针或字符串本身,因此我将它们设为常量。 最小的例子: void function(const
我希望能够限定 XHTML 文档中的 KnockOutJS 属性。 这是我想做的: My name is:
我正在浏览 Programming with Objective-C Apple 提供的文档。 我正在尝试理解以下段落,但到目前为止,无法理解。 @protocol XYZPieChartViewDa
给定两个 cv-unqualified 非数组对象类型 T1和 T2 , 可以表达 true ? std::declval() : std::declval()曾经有过 cv 限定的数组或函数类型吗?
我是一名优秀的程序员,十分优秀!