You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中auto声明使用问题求助(Visual Studio 2017环境)

解决Visual Studio 2017中auto声明的使用问题

嘿,我看你在VS2017里用auto的时候碰到问题了,代码写到一半断了,应该是在操作MyObj里的结构体容器时不知道怎么正确用auto对吧?我来帮你梳理正确的用法,同时排查可能踩的坑。

先补全你的代码场景,给你正确的auto用法示例

从你的代码片段来看,你应该是想给每个MyObj[a]刚添加的mystruct里的vi容器塞数据,或者后续遍历这些元素。这里给你两种常见的正确auto使用方式:

场景1:用auto简化元素引用,高效添加数据

你之前的代码写到MyObj...就停了,咱们可以这样补全——用auto&获取刚添加的结构体引用,避免不必要的拷贝:

int main() {
    MyClass MyObj[3];
    for (int a = 0; a < 3; a++) {
        MyObj[a].AddStructV();
        // 用auto&拿到刚push_back的mystruct的引用,直接操作原对象
        auto& target_struct = MyObj[a].TheStructV.back();
        for (int i = 1; i <= 5; i++) {
            target_struct.vi.push_back(i);
        }
    }
}

场景2:用auto配合范围for循环遍历容器

如果后续要遍历这些容器里的元素,auto能让代码简洁很多,不用写长长的类型名:

// 遍历MyObj数组里的每个对象
for (auto& obj : MyObj) {
    // 遍历每个对象的TheStructV容器
    for (auto& s : obj.TheStructV) {
        // 遍历每个mystruct里的vi容器
        for (auto num : s.vi) {
            cout << num << " ";
        }
        cout << endl;
    }
}

排查VS2017里auto可能出问题的地方

  • C++标准版本没开对:
    VS2017默认支持C17,但如果你的项目还在用老标准(比如C03),auto会直接报错。去项目属性里改一下:右键项目→属性→配置属性→C/C→语言→C标准,选ISO C++17 标准(/std:c++17)就行(VS2017最高支持到C++17)。
  • auto没初始化:
    auto必须在声明的时候就赋值,比如auto var;这种写法编译器根本不知道要推导什么类型,肯定报错。
  • 忘了加&导致拷贝:
    如果只写auto而不是auto&,会把容器里的对象拷贝一份出来,不仅效率低,你修改拷贝出来的对象也不会影响原容器里的内容,这是很多初学者容易踩的坑。

给你一份完整可运行的代码

把这些知识点整合起来,你可以直接运行这段代码看看效果:

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;

class MyClass {
public:
    struct mystruct {
        vector<int> vi;
    };
    vector<mystruct> TheStructV;
    void AddStructV() {
        TheStructV.push_back(mystruct());
    };
};

int main() {
    MyClass MyObj[3];
    // 给每个对象的容器填充数据
    for (int a = 0; a < 3; a++) {
        MyObj[a].AddStructV();
        auto& target = MyObj[a].TheStructV[0]; // 这里因为只添加了一个元素,所以取索引0
        for (int i = 1; i <= 5; i++) {
            target.vi.push_back(i + a * 5); // 给不同对象的元素加个偏移,方便区分输出
        }
    }

    // 用auto遍历输出所有元素
    for (auto& obj : MyObj) {
        for (auto& s : obj.TheStructV) {
            cout << "当前结构体的vi元素:";
            for (auto num : s.vi) {
                cout << num << " ";
            }
            cout << endl;
        }
    }

    return 0;
}

运行后你会看到每个MyObj对应的vi容器输出不同的数值,auto的使用完全符合预期~

内容的提问来源于stack exchange,提问作者Chi-fung LAM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:53:17