获取"矢量下标超出范围"错误

时间:2016-09-15 16:13:27

标签: c++ vector variadic-templates

我目前正试图获得"可变功能"向下,只是尝试在字符串向量中加载4个名称,然后将它们打印出来。当我用' int'键入和使用数字,它工作正常,但当我使用字符串向量时,我得到错误。

#include "stdafx.h"
#include<cstdio>
#include<cstdarg>
#include<string>
#include<vector>
#include<iostream>
using namespace std;



int count;

vector<string> namesVector;

void names(int count, ...)
{
    va_list namesList;

    int i; // for loop

    va_start(namesList, count);

    for (i = 0; i < count; i++)
    {
        string currentElement;
        currentElement = va_arg(namesList, string);

        namesVector[i] = currentElement;

    }

    va_end(namesList);
}


int main()
{
    int nameCount = 4;

    names(nameCount,"jon", "maggie", "joan", "alfred");

    for (int i = 0; i < nameCount; i++)
    {
        cout << "Name at element " << i << " is: " << namesVector[i] << endl;
    }

}

1 个答案:

答案 0 :(得分:3)

C ++只允许使用简单可复制类型作为可变参数。由于std::string可以从指向空终止缓冲区的char*指针构造,因此您可以使用char*而不是std::string类型。只需替换

currentElement = va_arg(namesList, string);

currentElement = va_arg(namesList, char*);
你的代码中的

。要摆脱这种限制,请考虑使用variadic templates,它可以在编译时为您使用的任何类型生成代码。

您的代码还包含运行时错误。这样:

namesVector[i] = currentElement;

很可能会导致您的程序崩溃,因为您没有在向量中分配任何内存。向量实际上是动态数组,因此您应该将size参数传递给适当的构造函数,或者在向量上调用resize。在你的情况下,你可能不会这样做,只需使用push_back method

namesVector.push_back(currentElement);