我有四个功能:
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:对重载函数的模糊调用
为什么呢?
答案 0 :(得分:2)
因为您的通话符合两者:
template<class Exception,class Argument>
void allocate_help(const Argument& arg,Int2Type<true>)const;
Exception = std::bad_alloc
和Argument = std::bad_alloc
(Argument
会自动推断),并且:
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;
编译器将如何选择?