首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >函数是不明确的,这不是

函数是不明确的,这不是
EN

Stack Overflow用户
提问于 2018-06-10 07:57:50
回答 1查看 222关注 0票数 8

我在做我的c++项目的时候得到了xxx is ambiguous。由于整个项目太大,不能在这里上传,我做了一个简单的例子,弹出了同样的错误信息。

#include <string>
#include <memory>

namespace a {

template <typename T, typename Target>
inline std::shared_ptr<T> getShared(Target const& t)
{
    return std::static_pointer_cast<T>(t->shared_from_this());
}

class A : public std::enable_shared_from_this<A>
{
};

}

namespace b {

template <typename T, typename Target>
inline std::shared_ptr<T> getShared(Target const& t)
{
    return std::static_pointer_cast<T>(t->shared_from_this());
}

class A : public std::enable_shared_from_this<A>
{
};

void invoke()
{
    // ERROR OCCURED!!!
    a::A* a;
    getShared<a::A>(a);

    // But this is compiled without any problem :(
    //  A* a;
    //  getShared<A>(a);
}

}

int main(int, char**)
{
    b::invoke();

    return 0;
}

这是错误信息...

clang++ -c -pipe -g -std=gnu++1y -Wall -W -fPIC -DQT_QML_DEBUG -I../untitled -I. -I/usr/lib/x86_64-linux-gnu/qt5/mkspecs/linux-clang -o main.o ../untitled/main.cpp
../untitled/main.cpp:34:2: error: call to 'getShared' is ambiguous
        getShared<a::A>(a);
        ^~~~~~~~~~~~~~~
../untitled/main.cpp:7:27: note: candidate function [with T = a::A, Target = a::A *]
inline std::shared_ptr<T> getShared(Target const& t)
                          ^
../untitled/main.cpp:21:27: note: candidate function [with T = a::A, Target = a::A *]
inline std::shared_ptr<T> getShared(Target const& t)

我尝试了使用gcc 6.3.0和clang 3.8.1-24,两个编译器都给了我相同的错误。

有没有人能告诉我这段代码出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-10 08:19:48

评论基本上回答了这个问题,但让我们来总结一下。

编译器的第一个挑战是解析getShared<a::A>(a);。这可能是operator<operator>,但是编译器first looks up getShared注意到它是一个模板,所以<a::A>是模板参数列表。

它也是一个函数模板,所以a是一个函数参数。在这一点上,一些复杂的事情发生了。由于a的类型为a::A*,因此它有一个关联的名称空间。编译器对getShared执行名称查找,因为它知道它是一个带有参数和相关名称空间的函数。这个第二个查找也会找到a::getShared。这也是一个函数模板,可以用<a::A>实例化。(SFINAE可以排除它,但参数是可以的)。

您现在有两个实例化,而重载解析并不能解决它们的歧义。

第二个查找的名称是参数相关查找,如miradulo所述。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50779504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档