尝试创建标记向量时出现C ++错误

时间:2014-05-30 09:59:12

标签: c++ class vector constructor token

我目前正在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

欢迎任何批评和帮助! - 谢谢你

2 个答案:

答案 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 } );
}

在这种情况下,编译器可以使用两个参数隐式调用构造函数。