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

Kyl*_*mek 4 c++ templates compilation

我有两个奇怪的情况,似乎代码应该编译,但它没有.首先,请考虑下面的代码,它成功编译:

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

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

但是如果我通过前缀"::"完全限定global_func,它就不会编译错误"'global_func'未在此范围内声明":

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

int main()
{
}
Run Code Online (Sandbox Code Playgroud)

此外,如果我尝试将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()
{
}
Run Code Online (Sandbox Code Playgroud)

为什么不在这些情况下编译?似乎没有实例化member_func()模板方法,因此它不应该找到缺少的函数错误.

CB *_*ley 10

在第一个示例中global_func是从属名称,因为它是后缀()表达式中使用的非限定名称,其中括号中的表达式取决于模板参数.这意味着必须推迟查找,直到模板被实例化,其中模板参数已知并且ADL可能有效.

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

类似地,在表达式中boost::bind(global_func),global_func不会在依赖于模板参数的表达式中使用,因此,查询不会延迟,并且声明必须在成员模板的定义点处可见.