gpt4 book ai didi

c++:模板中非限定名称查找的上下文

转载 作者:太空狗 更新时间:2023-10-29 23:07:08 25 4
gpt4 key购买 nike

我尝试查阅标准关于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) 带入“上下文”。三种方式:

  1. do_run(domain::mystruct) 放入命名空间域。
  2. do_run(domain::mystruct) 放入命名空间 lib::details 中。
  3. 在命名空间 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com