对函数的模糊调用

时间:2010-12-01 17:00:11

标签: c++ overloading

我有四个功能:

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:对重载函数的模糊调用 为什么呢?

2 个答案:

答案 0 :(得分:2)

因为您的通话符合两者:

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。因此,电话的含糊不清。

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

答案 1 :(得分:2)

因为他们很凶悍。

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;

第二个函数的签名是第一个函数的一个子集,这意味着在函数调用的上下文中,它们与将“any type”作为第一个参数并将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;

编译器将如何选择?