Чтобы помочь вам в этом, я даю свои коды: (main.cpp), задействован только один файл.
#include <iostream>
#include <vector>
using namespace std;
class test{
public :
int member {0};
void fun(){cout << "member is " << member << endl;}
test(){}
//test(int param) : member(param){} //this line is commented.
};
int main()
{
vector<test> *vp = new vector<test>[2] {{10},{20}};
//vector<test> array[2] {{10},{20}};//this won't work either.
cout << "size of vp[0] is " << vp[0].size() << endl;
cout << "size of vp[1] is " << vp[1].size() << endl;
return 0;
}
Я намерен инициализировать vp[0]
размером 10 и vp[1]
размером 20
. Однако, когда я скомпилировал его на mac
, используя g++ -std=c++11 main.cpp -o main
, он пожаловался:
main.cpp:14:45: error: chosen constructor is explicit in copy-initialization
vector<test> *vp = new vector<test>[2] {{10},{20}};
^~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:517:14: note:
constructor declared here
explicit vector(size_type __n);
^
main.cpp:14:50: error: chosen constructor is explicit in copy-initialization
vector<test> *vp = new vector<test>[2] {{10},{20}};
^~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:517:14: note:
constructor declared here
explicit vector(size_type __n);
^
В CentOS Linux, используя ту же команду, и я получил
main.cpp: In function ‘int main()’:
main.cpp:14:54: error: converting to ‘std::vector<test>’ from initializer list would use explicit constructor ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = test; _Alloc = std::allocator<test>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<test>]’
vector<test> *vp = new vector<test>[2] {{10},{20}};
^
main.cpp:14:54: error: converting to ‘std::vector<test>’ from initializer list would use explicit constructor ‘std::vector<_Tp, _Alloc>::vector(std::vector<_Tp, _Alloc>::size_type, const allocator_type&) [with _Tp = test; _Alloc = std::allocator<test>; std::vector<_Tp, _Alloc>::size_type = long unsigned int; std::vector<_Tp, _Alloc>::allocator_type = std::allocator<test>]’
Что здесь происходит? Почему это связано с ключевым словом explicit
?
Я знаю, что вектор имеет несколько конструкторов (например, тот, что с аргументом типа initializer-list). Если я инициализирую вектор как vector<test> temp {10}
, это будет инициализировать вектор размером 10 без каких-либо проблем explicit
. Я не знаю, что скрыто внутри, когда дело доходит до vector<test> array[2] {{10},{20}}
, что вызывает у меня ошибку.
Интересно, что если я предоставлю классу test
конструктор с одним аргументом (просто раскомментируем строку в моем коде), компилятор вообще не будет жаловаться. Но значение vector<test> array[2] {{10},{20}}
изменилось, чтобы инициализировать вектор array[0]
объектами типа 2 test
, инициализированными с 10
и 20
соответственно. Но синтаксис vector<test> array[2] {10,20}
, который я попробовал позже, снова неверен.
Я не знаю, что здесь происходит, и я полностью потерян. Разве {10,20}
не относится к типу списка инициализаторов?
Я очень ценю, если вы можете объяснить, что здесь происходит, и как инициализировать массив векторов разного размера (пожалуйста, не используйте обходные пути). Я хочу знать, что именно означает синтаксис.