Конструктор вызовов С++ внутри другого конструктора того же класса
Я использую MinGW-w64 с 4.8.1 (с -std = С++ 11) и пытаюсь вызвать один конструктор моего класса внутри другого конструктора того же класса. К сожалению, я не смог скомпилировать код ниже.
A::A(const char *pc) {
A(string(pc));
}
A::A(string s) {
vector<string> tmpVector;
tmpVector.push_back(s);
A(tmpVector);
}
// Constructor
A::A(vector<string> filePathVector) {
}
Ниже приведена ошибка, с которой GCC жалуется.
In file included from ../parser/nsn/parser.h:37:0,
from main.cpp:2:
../parser/nsn/parserimp.h: In constructor 'A::A(std::string)':
../parser/nsn/parserimp.h:522:29: error: conflicting declaration 'A tmpVector'
A(tmpVector);
^
../parser/nsn/parserimp.h:520:17: error: 'tmpVector' has a previous declaration as 'std::vector<std::basic_string<char> > tmpVector'
vector<string> tmpVector;
Я прочитал о делегированной концепции конструктора в С++ 11, но я не уверен, что это то, что я после....
Ответы
Ответ 1
Это
A(tmpVector);
совпадает с этим
A tmpVector; // but there is already an object called tmpVector
Это объясняет ошибку. Похоже, вы хотите вызвать другой конструктор для инициализации одного и того же объекта. В этом случае вы можете использовать делегирующие конструкторы:
A::A(string s) : A(vector<string>{s})
{
}
Обратите внимание, что это была одна из последних возможностей языка С++ 11 для добавления в самые популярные компиляторы, поэтому может не работать, если ваш компилятор не имеет полной поддержки языка С++ 11.
Ответ 2
Спасибо, это окончательный код, который был скомпилирован с помощью mingw-w64 с GCC 4.8.1
A::A(const char *p) : A(string(p)) {
}
A::A(string s) : A(vector<string>{s}) {
}
A::A(vector<string> filePathVector) {
// Do stuff here
}