c++ - 功能不明确,不是
问题描述
我xxx is ambiguous
在处理我的 C++ 项目时得到了。由于整个项目太大而无法在这里上传,我做了一个简单的例子,弹出相同的错误消息。
#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,两个编译器都给了我同样的错误。
有人可以让我知道这段代码有什么问题吗?
解决方案
评论基本上回答了这个问题,但让我们把它全部包起来。
编译器的第一个挑战是解析getShared<a::A>(a);
. 现在这可能是operator<
and operator>
,但编译器首先查找 getShared
并注意到它是一个模板,所以 the<a::A>
是模板参数列表。
它也是一个函数模板,a
函数参数也是。在这一点上,发生了一些复杂的事情。由于a
has 类型a::A*
,它有一个关联的命名空间。编译器对 进行新的名称查找getShared
,现在它知道它是一个带有参数和关联命名空间的函数。这第二次查找也发现a::getShared
. 那也是一个函数模板,可以用<a::A>
. (SFINAE 可以排除它,但论证是可以的)。
您现在有两个实例化,重载决议并不能解决它们的歧义。
如miradulo 所述,第二次查找的名称是Argument Dependent Lookup 。
推荐阅读
- python-3.x - 从云函数连接到云 sql 时出现 Python 错误
- laravel - 为什么我们要在 Laravel Sanctum 上调用 sanctum/csrf-cookie
- python - “您的程序中有错误:扫描单引号时 EOL”python 2.5 需要帮助来解决此代码
- python - NEO4J MATCH 查询返回不正确的输出
- css - Next.js 配置破坏了包的 CSS
- javascript - 如何及时获取今天的日期+ 00:00:00
- r - 当您在 R 中混合使用数字和字符时如何舍入?
- java - Java 在执行 Callable 之前等待变量
- azure-devops - 在 azure devops 中设置项目头像的 PAT 范围有哪些?
- ios - 使用 UIPencilKit 预定义的形状