我使用MinGW-w64和4.8.1(带-std = c ++ 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;
我已经阅读过C ++ 11中委托的构造函数概念,但我不确定这是我追求的......
答案 0 :(得分:26)
此
A(tmpVector);
与此相同
A tmpVector; // but there is already an object called tmpVector
这解释了错误。看起来您想要调用另一个构造函数来初始化同一个对象。在这种情况下,您可以使用委派构造函数:
A::A(string s) : A(vector<string>{s})
{
}
请注意,这是最新的C ++ 11语言功能之一,要添加到最流行的编译器中,因此如果您的编译器没有完整的C ++ 11语言支持,它可能无效。
答案 1 :(得分:1)
谢谢大家,这是最终代码,使用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
}