从 initializer_list 初始化向量会产生不明确的编译错误
initializing a vector from an initializer_list generates an unclear compilation error
如果 std::copy
被注释掉并且 atc
初始值设定项未被注释,则此代码可以编译。
class MyClass {
MyClass( OtherClass* poc_in, std::initializer_list<ThirdClass> iltc) :
poc( poc_in)
//, atc(iltc)
{
std::copy( iltc.begin(), iltc.end(), atc );
}
OtherClass* poc;
std::vector<ThirdClass> atc;
}
然而,正如我所写的那样:
In file included from /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/algorithm:61:0,
from ../../../src/tester/main.cpp:5:
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h: In instantiation of '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = const ThirdClass*; _OI = std::vector<ThirdClass>]':
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:422:45: required from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = const ThirdClass*; _OI = std::vector<ThirdClass>]'
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:455:8: required from '_OI std::copy(_II, _II, _OI) [with _II = const ThirdClass*; _OI = std::vector<ThirdClass>]'
../../../src/tester/main.cpp:75:59: required from here
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:378:57: error: no type named 'value_type' in 'struct std::iterator_traits<std::vector<ThirdClass> >'
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
^~~~~~~~~~~
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:383:9: error: no type named 'value_type' in 'struct std::iterator_traits<std::vector<ThirdClass> >'
const bool __simple = (__is_trivial(_ValueTypeI)
~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_II>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_OI>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __are_same<_ValueTypeI, _ValueTypeO>::__value);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我在 Stack Overflow 上阅读了六个类似的问题,但 none 阐明了为什么这个版本不受欢迎。有什么建议吗?
这与初始化列表无关。
你用的std::copy
错了。
第三个参数应该是输出迭代器,而不是向量。
尝试使用 std::back_inserter
:
std::copy( iltc.begin(), iltc.end(), std::back_inserter(atc) );
编译错误诚然有点深奥,但它是说编译器正在寻找特征中的成员 value_type
(all 大多数迭代器都有)你给它的参数类型的助手(向量),它不存在(因为向量不是迭代器)。
如果 std::copy
被注释掉并且 atc
初始值设定项未被注释,则此代码可以编译。
class MyClass {
MyClass( OtherClass* poc_in, std::initializer_list<ThirdClass> iltc) :
poc( poc_in)
//, atc(iltc)
{
std::copy( iltc.begin(), iltc.end(), atc );
}
OtherClass* poc;
std::vector<ThirdClass> atc;
}
然而,正如我所写的那样:
In file included from /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/algorithm:61:0,
from ../../../src/tester/main.cpp:5:
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h: In instantiation of '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = const ThirdClass*; _OI = std::vector<ThirdClass>]':
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:422:45: required from '_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = const ThirdClass*; _OI = std::vector<ThirdClass>]'
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:455:8: required from '_OI std::copy(_II, _II, _OI) [with _II = const ThirdClass*; _OI = std::vector<ThirdClass>]'
../../../src/tester/main.cpp:75:59: required from here
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:378:57: error: no type named 'value_type' in 'struct std::iterator_traits<std::vector<ThirdClass> >'
typedef typename iterator_traits<_OI>::value_type _ValueTypeO;
^~~~~~~~~~~
/opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/stl_algobase.h:383:9: error: no type named 'value_type' in 'struct std::iterator_traits<std::vector<ThirdClass> >'
const bool __simple = (__is_trivial(_ValueTypeI)
~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_II>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __is_pointer<_OI>::__value
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&& __are_same<_ValueTypeI, _ValueTypeO>::__value);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我在 Stack Overflow 上阅读了六个类似的问题,但 none 阐明了为什么这个版本不受欢迎。有什么建议吗?
这与初始化列表无关。
你用的std::copy
错了。
第三个参数应该是输出迭代器,而不是向量。
尝试使用 std::back_inserter
:
std::copy( iltc.begin(), iltc.end(), std::back_inserter(atc) );
编译错误诚然有点深奥,但它是说编译器正在寻找特征中的成员 value_type
(all 大多数迭代器都有)你给它的参数类型的助手(向量),它不存在(因为向量不是迭代器)。