我在>>> 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
解决这个问题,但不是。这里发生了什么?
答案 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;