为什么此函数重载与参数类型转换不明确?

查尔斯·威尔科克斯

有人可以解释这个函数重载解析度是如何模棱两可的吗?

鉴于:

/// This type *contains* a @c T.
template< typename T >
class User_Type
{
public:
    /// This <em>conversion constructor</em> is a key part of it's API;
    ///   it won't likely change.
    User_Type( T const & ar_data )
      : m_data( ar_data )
    {}
private:
    T m_data;
};

/// @c some_value is just a templated function that generates a @c T.
template< typename T > T some_value();
template<> char some_value();
template<> int some_value();

/// This overloaded, non-templated function represents some third-party
///   code somewhere else; it's API can't be changed.
void other_function( User_Type< char > const& );
void other_function( User_Type< int > const& );

/// This is user-code.  It's contents exercise some aspect of the 'User_Type' API.
///   This code can change.
template< typename T >
void function()
{
    other_function( some_value< T >() ); /* AMBIGUOUS CALL */

    User_Type< T > user_var = some_value< T >(); /* UNAMBIGUOUS CONVERSION */
    other_function( user_var ); /* UNAMBIGUOUS CALL */
}
template void function< char >();
template void function< int >();

并使用进行编译g++-4.9 -Wall -Wextra,我收到以下错误:

In instantiation of ‘void function() [with T = char]’:
    error: call of overloaded ‘other_function(char)’ is ambiguous
    note: candidates are:
    note: void other_function(const User_Type<char>&)
    note: void other_function(const User_Type<int>&)
In instantiation of ‘void function() [with T = int]’:
    error: call of overloaded ‘other_function(int)’ is ambiguous
    note: candidates are:
    note: void other_function(const User_Type<char>&)
    note: void other_function(const User_Type<int>&)

我希望最好的比赛other_function( char )other_function( User_Type< char > const& ),最好的比赛other_function( int )other_function( User_Type< int > const& )

我了解必须为的每个参数进行类型转换other_function我预计charUser_Type< char >是一个更好的选择,而不是charUser_Type< int >,这可能是被允许charint推广。我预计intUser_Type< int >是一个更好的选择,而不是intUser_type< char >,这可能是被允许intchar转换。

另外,如果我User_Type< T > user_var创建本地T,那么我可以明确地致电other_function( user_var )从语义上讲,这应该等效于第一个原始语句。

hs_

由于没有与other_function(char)或的完全匹配other_function(int)

other_function( some_value< T >() );

必须隐式转换其参数以匹配以下之一:

void other_function( User_Type< char > const& );
void other_function( User_Type< int > const& );

但是User_Type<char>有ctorUser_Type<char>( char const& )接受一个int,并且User_Type<int>有ctorUser_Type<int>( int const& )接受一个char

您的转换属于“用户定义的转换顺序”的排名,并且由于这两种转换都是可能的,因此两者均包含在具有相同排名的过载集中。因此,通话是不明确的。(有关更多信息,请参见13.3.3.2在标准中对隐式转换序列进行排名。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么此函数重载与参数类型转换不明确?

来自分类Dev

为什么对重载函数的调用不明确?

来自分类Dev

传递给模板函数的两个lambda使参数的类型推导不明确-为什么?

来自分类Dev

为什么此代码不明确?

来自分类Dev

函数参数不明确

来自分类Dev

为什么此调用对编译器不明确?

来自分类Dev

不明确的函数重载 [例如 max()]

来自分类Dev

重载函数的调用不明确

来自分类Dev

调用函数不明确,但是为什么呢?

来自分类Dev

为什么编译器在 C++11 中给出消息“重载函数的调用不明确”?

来自分类Dev

时间不明确,为什么?

来自分类Dev

使用QApplication :: applicationDirPath调用时,重载的arg(QString(&)())的调用不明确,为什么?

来自分类Dev

用变量参数重载时方法不明确

来自分类Dev

重载函数的调用不明确,double vs float

来自分类Dev

为什么此运算符=调用不明确?

来自分类Dev

为什么git reflog HEAD @ {0}返回不明确的参数

来自分类Dev

为什么嵌套的关联类型路径被认为是不明确的?

来自分类Dev

为什么postgres触发函数返回一些列引用不明确?

来自分类Dev

为什么我的函数名不明确?不是恕我直言吗?

来自分类Dev

类型不明确的作品

来自分类Dev

推断类型不明确

来自分类Dev

类型名称不明确

来自分类Dev

javascript中带有函数参数的语法不明确

来自分类Dev

函数类型对成员nextInt()的引用不明确

来自分类Dev

解决了不明确的重载方法调用

来自分类Dev

为什么对swap()的调用不明确?

来自分类Dev

为什么这些方法调用不明确?

来自分类Dev

C ++为什么调用不明确?

来自分类Dev

CFG:为什么这个语法不明确?

Related 相关文章

热门标签

归档