使用C++编程语言时,std::cont::value_type通常用于表示容器中存储的对象类型

118 篇文章 ¥29.90 ¥99.00
本文介绍了C++中std::cont::value_type的作用,通过示例展示了如何利用该特性确定容器存储的数据类型,并讨论了不同编译器下可能存在的差异。内容包括使用decltype获取容器元素类型并打印,以及处理类型信息的一般建议。

使用C++编程语言时,std::cont::value_type通常用于表示容器中存储的对象类型。为了更好地理解这个概念,并确保代码的正确性和可读性,我们可以编写相关的测试程序。

下面是一个测试程序的示例,它演示了如何使用std::cont::value_type来确定容器存储的数据类型,并将其打印到控制台上。

#include <iostream>
#include <vector>
#include <list>

int main()
{
    // 定义两个容器,并初始化
    std::vector<int> int_vector = {1, 2, 3};
    std::list<double> double_list = {2.1, 3.2, 4.7};

    // 获取容器内的数据类型
    typedef decltype(int_vector)::value_type int_vector_type;
    typedef decltype(double_list)::value_type double_list_type;

    // 打印数据类型
    std::cout << "int_vector存储的数据类型为: " << typeid(int_vector_type).name() << std::endl;
    std::cout << "double_list存储的数据类型为: " << typeid(double_list_type).name() << std::endl;

    return 0;
}
/tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c: In function 'int main()': /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:17:26: error: no matching function for call to 'size(int [(<anonymous> + 1)])' 17 | for(int i=1;i<=size(a);i++) | ^ In file included from /usr/include/c++/9/string:54, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/range_access.h:242:5: note: candidate: 'template<class _Container> constexpr decltype (__cont.size()) std::size(const _Container&)' 242 | size(const _Container& __cont) noexcept(noexcept(__cont.size())) | ^~~~ /usr/include/c++/9/bits/range_access.h:242:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:17:26: note: variable-sized array type 'int [(<anonymous> + 1)]' is not a valid template argument 17 | for(int i=1;i<=size(a);i++) | ^ In file included from /usr/include/c++/9/string:54, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/range_access.h:252:5: note: candidate: 'template<class _Tp, long unsigned int _Nm> constexpr std::size_t std::size(const _Tp (&)[_Nm])' 252 | size(const _Tp (&/*__array*/)[_Nm]) noexcept | ^~~~ /usr/include/c++/9/bits/range_access.h:252:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:17:26: note: variable-sized array type 'long int' is not a valid template argument 17 | for(int i=1;i<=size(a);i++) | ^ /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:13: error: no match for 'operator>>' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'int') 19 | cout>>a[i]; | ~~~~^~~~~~ | | | | | int | std::ostream {aka std::basic_ostream<char>} /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:13: note: candidate: 'operator>>(int, int)' <built-in> 19 | cout>>a[i]; | ~~~~^~~~~~ /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:13: note: no known conversion for argument 1 from 'std::ostream' {aka 'std::basic_ostream<char>'} to 'int' In file included from /usr/include/c++/9/string:56, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::__cxx11::basic_string<_CharT, _Traits, _Allocator>&)' 1466 | operator>>(basic_istream<_CharT, _Traits>& __in, | ^~~~~~~~ /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/istream.tcc:931:5: note: candidate: 'template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)' 931 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:931:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:756:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)' 756 | operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:756:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:761:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&)' 761 | operator>>(basic_istream<char, _Traits>& __in, signed char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:761:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/istream.tcc:963:5: note: candidate: 'template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)' 963 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:963:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:803:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)' 803 | operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:803:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:808:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*)' 808 | operator>>(basic_istream<char, _Traits>& __in, signed char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:808:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 19 | cout>>a[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:980:5: note: candidate: 'template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&)' 980 | operator>>(_Istream&& __is, _Tp&& __x) | ^~~~~~~~ /usr/include/c++/9/istream:980:5: note: template argument deduction/substitution failed: /usr/include/c++/9/istream: In substitution of 'template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&) [with _Istream = std::basic_ostream<char>&; _Tp = int&]': /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:19:18: required from here /usr/include/c++/9/istream:980:5: error: no type named 'type' in 'struct std::enable_if<false, void>' /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:21:30: error: no matching function for call to 'size(int [(<anonymous> + 1)])' 21 | for(int i=1;i<=size(b);i++) | ^ In file included from /usr/include/c++/9/string:54, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/range_access.h:242:5: note: candidate: 'template<class _Container> constexpr decltype (__cont.size()) std::size(const _Container&)' 242 | size(const _Container& __cont) noexcept(noexcept(__cont.size())) | ^~~~ /usr/include/c++/9/bits/range_access.h:242:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:21:30: note: variable-sized array type 'int [(<anonymous> + 1)]' is not a valid template argument 21 | for(int i=1;i<=size(b);i++) | ^ In file included from /usr/include/c++/9/string:54, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/range_access.h:252:5: note: candidate: 'template<class _Tp, long unsigned int _Nm> constexpr std::size_t std::size(const _Tp (&)[_Nm])' 252 | size(const _Tp (&/*__array*/)[_Nm]) noexcept | ^~~~ /usr/include/c++/9/bits/range_access.h:252:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:21:30: note: variable-sized array type 'long int' is not a valid template argument 21 | for(int i=1;i<=size(b);i++) | ^ /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:13: error: no match for 'operator>>' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'int') 23 | cout>>b[i]; | ~~~~^~~~~~ | | | | | int | std::ostream {aka std::basic_ostream<char>} /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:13: note: candidate: 'operator>>(int, int)' <built-in> 23 | cout>>b[i]; | ~~~~^~~~~~ /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:13: note: no known conversion for argument 1 from 'std::ostream' {aka 'std::basic_ostream<char>'} to 'int' In file included from /usr/include/c++/9/string:56, from /usr/include/c++/9/bits/locale_classes.h:40, from /usr/include/c++/9/bits/ios_base.h:41, from /usr/include/c++/9/ios:42, from /usr/include/c++/9/ostream:38, from /usr/include/c++/9/iostream:39, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: candidate: 'template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::__cxx11::basic_string<_CharT, _Traits, _Allocator>&)' 1466 | operator>>(basic_istream<_CharT, _Traits>& __in, | ^~~~~~~~ /usr/include/c++/9/bits/basic_string.tcc:1466:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/istream.tcc:931:5: note: candidate: 'template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&)' 931 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:931:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:756:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&)' 756 | operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:756:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:761:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&)' 761 | operator>>(basic_istream<char, _Traits>& __in, signed char& __c) | ^~~~~~~~ /usr/include/c++/9/istream:761:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/istream:991, from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/bits/istream.tcc:963:5: note: candidate: 'template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*)' 963 | operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) | ^~~~~~~~ /usr/include/c++/9/bits/istream.tcc:963:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<_CharT, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:803:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*)' 803 | operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:803:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:808:5: note: candidate: 'template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*)' 808 | operator>>(basic_istream<char, _Traits>& __in, signed char* __s) | ^~~~~~~~ /usr/include/c++/9/istream:808:5: note: template argument deduction/substitution failed: /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'std::basic_istream<char, _Traits>' 23 | cout>>b[i]; | ^ In file included from /usr/include/c++/9/iostream:40, from /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:1: /usr/include/c++/9/istream:980:5: note: candidate: 'template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&)' 980 | operator>>(_Istream&& __is, _Tp&& __x) | ^~~~~~~~ /usr/include/c++/9/istream:980:5: note: template argument deduction/substitution failed: /usr/include/c++/9/istream: In substitution of 'template<class _Istream, class _Tp> typename std::enable_if<std::__and_<std::__not_<std::is_lvalue_reference<_Tp> >, std::__is_convertible_to_basic_istream<_Istream>, std::__is_extractable<typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type, _Tp&&, void> >::value, typename std::__is_convertible_to_basic_istream<_Tp>::__istream_type>::type std::operator>>(_Istream&&, _Tp&&) [with _Istream = std::basic_ostream<char>&; _Tp = int&]': /tmp/cca6ccd2a78d4e09be0558c2ecdbdc5a/main.c:23:18: required from here /usr/include/c++/9/istream:980:5: error: no type named 'type' in 'struct std::enable_if<false, void>'
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值