对函数的不明确调用

发布于 2024-10-05 20:14:17 字数 709 浏览 7 评论 0原文

我有四个函数:

template<class Exception,class Argument>
 void allocate_help(const Argument& arg,Int2Type<true>)const;

 template<class Exception,class Argument>
 std::nullptr_t allocate_help(const Argument& arg,Int2Type<false>)const;

 template<class Exception>
 void allocate_help(const Exception& ex,Int2Type<true>)const;

 template<class Exception>
 std::nullptr_t allocate_help(const Exception& ex,Int2Type<false>)const;

但是当我调用时:

allocate_help<std::bad_alloc>(e,Int2Type<true>()); //here e is of a std::bad_alloc type 

我收到错误:
错误 3 错误 C2668:对重载函数的不明确调用 为什么?

I have four functions:

template<class Exception,class Argument>
 void allocate_help(const Argument& arg,Int2Type<true>)const;

 template<class Exception,class Argument>
 std::nullptr_t allocate_help(const Argument& arg,Int2Type<false>)const;

 template<class Exception>
 void allocate_help(const Exception& ex,Int2Type<true>)const;

 template<class Exception>
 std::nullptr_t allocate_help(const Exception& ex,Int2Type<false>)const;

but when I call:

allocate_help<std::bad_alloc>(e,Int2Type<true>()); //here e is of a std::bad_alloc type 

I'm getting an error:
Error 3 error C2668: ambiguous call to overloaded function
Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怪我入戏太深 2024-10-12 20:14:17

因为您的调用同时匹配:

template<class Exception,class Argument>
 void allocate_help(const Argument& arg,Int2Type<true>)const;

Exception = std::bad_allocArgument = std::bad_allocArgument 是自动推导出来的),并且:

template<class Exception>
 void allocate_help(const Exception& ex,Int2Type<true>)const;

Exception = std::bad_alloc。因此,通话的含糊性。

另外我认为你的编译器应该在错误行之后输出所有匹配的函数,这样你就可以自己回答你的问题。

Because your call matches both:

template<class Exception,class Argument>
 void allocate_help(const Argument& arg,Int2Type<true>)const;

with Exception = std::bad_alloc and Argument = std::bad_alloc (Argument is automatically deduced), and:

template<class Exception>
 void allocate_help(const Exception& ex,Int2Type<true>)const;

with Exception = std::bad_alloc. Hence the ambiguity of the call.

Also I think that your compiler should output all the matching function after the error line, so you could answer your question yourself.

忆悲凉 2024-10-12 20:14:17

因为他们是暧昧的。

template<class Exception,class Argument>
std::nullptr_t allocate_help(const Argument& arg,Int2Type<true>)const;

template<class Exception>
std::nullptr_t allocate_help(const Exception& ex,Int2Type<true>)const;

第二个函数的签名是第一个函数的子集,这意味着在函数调用的上下文中,它们与将“任何类型”作为第一个参数和 Int2Type 作为第二个参数相同。

allocate_help<std::bad_alloc>(e,Int2Type<true>());

可以变成:

std::nullptr_t allocate_help<std::bad_alloc, std::bad_alloc>(const std::bad_alloc& arg,Int2Type<true>)const;

 std::nullptr_t allocate_help<std::bad_alloc>(const std::bad_alloc& ex,Int2Type<true>)const;

编译器会如何选择?

Because they are ambigious.

template<class Exception,class Argument>
std::nullptr_t allocate_help(const Argument& arg,Int2Type<true>)const;

template<class Exception>
std::nullptr_t allocate_help(const Exception& ex,Int2Type<true>)const;

The signature of the second function is a subset of the first one, which means that in the context of your function call they are the same of taking "any type" as first argument and Int2Type as second argument.

allocate_help<std::bad_alloc>(e,Int2Type<true>());

Can become either:

std::nullptr_t allocate_help<std::bad_alloc, std::bad_alloc>(const std::bad_alloc& arg,Int2Type<true>)const;

or

 std::nullptr_t allocate_help<std::bad_alloc>(const std::bad_alloc& ex,Int2Type<true>)const;

How would the compiler choose?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文