没有匹配的成员函数来调用'插入'

时间:2016-02-17 19:18:46

标签: c++ templates

我在>>> block = pd.DataFrame({"eps":["", ""]}) >>> block = block.convert_objects(convert_numeric=True) >>> block["eps"] 0 1 Name: eps, dtype: object >>> block["eps"].astype('float') ... ValueError: could not convert string to float: 类上有以下方法声明:

basic_buffer

注意第二个参数的类型。我经常使用这个const_iterator insert(const_iterator position, typename argument<value_type>::type val) 特征,它基本上决定了在接收模板参数时是通过复制还是通过引用传递参数。在这种情况下,argument是模板参数value_type的{​​{1}}。例如,基本类型应该通过复制而不是const引用传递。这是实施:

typedef

注意基本和指针类型如何评估T和其他类型评估为template <typename T> struct argument { typedef std::conditional<std::is_fundamental<T>::value || std::is_pointer<T>::value, const T, const T &> type; }; 。到目前为止,这一直很有效。

现在考虑以下功能:

const T

省略了几个细节。这就是我得到的:

const T &

令我惊讶的是这个重载版本没有匹配:

template <class T>
void foo()
{
    typedef basic_buffer<T> _storage_type;
    typedef typename _storage_type::value_type _value_type;

    _value_type value = 0;
    _storage_type _storage;

    _storage.insert(_storage.end(), value);
}

如果我将error: no matching member function for call to 'insert' _storage.insert(_storage.end(), value); ~~~~~~~~~^~~~~~ 转换为note: candidate function not viable: no known conversion from '_value_type' (aka 'unsigned char') to 'typename argument<value_type>::type' (aka 'conditional<std::is_fundamental<unsigned char>::value || std::is_pointer<unsigned char>::value, const unsigned char, const unsigned char &>') for 2nd argument const_iterator insert(const_iterator position, typename argument<value_type>::type val) (特别是已经是它的类型),那么事情会更加令人困惑:

value

所以我可以通过投射_value_type解决这个问题,但不是。这里发生了什么?

1 个答案:

答案 0 :(得分:3)

你有

typedef std::conditional<std::is_fundamental<T>::value || std::is_pointer<T>::value, const T, const T &> type;

所以类型是std::conditional<std::is_fundamental<T>::value || std::is_pointer<T>::value, const T, const T &>

致电时

_storage.insert(_storage.end(), value);

它正在尝试将value转换为std::conditional<std::is_fundamental<T>::value || std::is_pointer<T>::value, const T, const T &>

您需要将::type添加到条件中以从条件中获取结果类型。

typedef std::conditional<std::is_fundamental<T>::value || std::is_pointer<T>::value, const T, const T &>::type type;