gpt4 book ai didi

c++ - 模板代码无法编译(延迟查找)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:50 24 4
gpt4 key购买 nike

我有两个奇怪的情况,看起来代码应该编译,但实际上没有。首先,考虑下面的代码,它编译成功:

struct A
{
template <class T>
void member_func(T t)
{
global_func(t);
}
};

int main()
{
}

但如果我通过前缀“::”完全限定 global_func,它不会编译并出现错误“'global_func' 未在此范围内声明”:

struct A
{
template <class T>
void member_func(T t)
{
::global_func(t);
}
};

int main()
{
}

此外,如果我尝试将 global_func 传递给 boost::bind,它不会编译(同样的错误):

#include <boost/bind.hpp>

class A
{
template <class T>
void member_func(T t)
{
boost::bind(global_func)(t);
}
};

int main()
{
}

为什么在这些情况下不能编译?看起来 member_func() 模板方法没有实例化,所以它不应该找到丢失的函数错误。

最佳答案

在第一个示例中,global_func 是一个依赖名称,因为它是后缀 () 表达式中使用的非限定名称,其中括号中的表达式依赖于模板参数。这意味着查找必须推迟到模板被实例化时模板参数已知并且 ADL 可能会产生影响。

在第二个示例中,::global_func 是一个限定名称,因此它的查找不会延迟,并且必须在定义模板的指针处查找。

类似地,在表达式 boost::bind(global_func) 中,global_func 没有用在依赖于模板参数的表达式中,因此,再一次,查找不是deferred 并且声明必须在成员模板的定义点可见。

关于c++ - 模板代码无法编译(延迟查找),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204401/

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