当前位置:  开发笔记 > 编程语言 > 正文

依赖于参数的查找和函数模板

如何解决《依赖于参数的查找和函数模板》经验,为你挑选了0个好方法。

这是一个例子:

#include 
#include 
#include 

using std::string;

int main()
{
    string str = "This is a string";

    // ok: needn't using declaration, ADL works
    auto it = find(str.begin(), str.end(), 'i');

    // error: why ADL doesn't work?
    std::shared_ptr sp = make_shared(str);
}

当我试图编译这个程序时,编译器抱怨:

error: no template named 'make_shared'; did you mean 'std::make_shared'?
        std::shared_ptr sp = make_shared(str); // error...
                                     ^~~~~~~~~~~
                                     std::make_shared

我猜第一个函数find不需要using声明,因为依赖于参数的lookup(ADL):编译器会搜索名称空间string(即std)的定义find.但对于第二个函数make_shared,它似乎ADL不起作用:我必须使用std::make_sharedusing声明.我知道两个函数模板的定义是不同的:前者将其模板参数之一(typename T或类似的东西)作为函数参数类型并返回相同的类型.后者将函数参数包作为函数参数,其返回类型是另一个模板参数.禁用这个区别ADL吗?或者你能帮助回答这个问题并提供一些参考资料吗?

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有