Подтвердить что ты не робот

Конструктор вызовов С++ внутри другого конструктора того же класса

Я использую 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, но я не уверен, что это то, что я после....

4b9b3361

Ответ 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
}