我目前正在Stroustrup"原则与实践"学习如何使用C ++编程的书。我在他们介绍Tokens并展示如何使用它们的部分。我试图做一个简单的测试,以确保我正确地构建类并正确使用标记和向量。
以下是我所做的一个例子。
class Test{
public:
char kind;
double value;
Test(char ch)
:kind(ch), value(0){}
Test(char ch, double val)
:kind(ch),value(val){}
};
int main(){
vector<Test>testLoop;
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back(i, 1);
}
cout << testLoop[5].kind << endl << testLoop[5].value;
}
我想要完成的事情(我认为)是拥有一个对象向量,它们都获得了类的成员&#39;测试&#39;,做一个循环,将其中的一些添加到vector&#39; testLoop&#39;,(并在所有值成员中放置1)然后打印出testLoop [5] .kind和testLoop [5] .value的值。
我得到的具体错误是:
|25|error: no matching function for call to 'std::vector<Test>::push_back(char&, int)'|
candidate expects 1 argument, 2 provided
欢迎任何批评和帮助! - 谢谢你
答案 0 :(得分:4)
std::vector::push_back
获取存储在向量中的类型的对象。所以在这种情况下你需要
testLoop.push_back(Test(i, 1));
你也可以使用std::vector::emplace_back
,它接受类型的构造函数参数并直接在向量中构造一个对象:
testLoop.emplace_back(i, 1);
答案 1 :(得分:1)
Class Test有两个构造函数。 有一个参数的建设者
Test(char ch)
:kind(ch), value(0){}
被称为转换构造函数,因为它实际上将类型对象(在本例中为char
)转换为类型为Test
的对象
所以你可以用以下方式调用方法push_back
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back( i );
}
在这种情况下,编译器将使用转换构造函数,因为您没有显式写入
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back( Test( i ) );
}
所以编译器会隐式执行此操作。
但是,如果要使用函数说明符explicit
explicit Test(char ch)
:kind(ch), value(0){}
然后编译器无法隐式调用它并发出错误。在这种情况下,您必须自己明确指定构造函数
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back( Test( i ) );
}
如果你在循环中使用两个参数
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back(i, 1);
}
编译器不那么聪明,不能隐式调用具有两个参数的构造函数。它发出错误更简单。
但是,如果编译器支持C ++ 2011的此功能,则可以使用初始化列表
for(char i = 'a'; i < 'k'; i++){
testLoop.push_back( { i, 1 } );
}
在这种情况下,编译器可以使用两个参数隐式调用构造函数。