.BEGIN的左侧必须具有类/结构/联合

Left of .begin must have class/struct/union

本文关键字:结构 联合 BEGIN      更新时间:2023-10-16

我绝对是C 的新手,并且由于大学的教授正在教我C ATM,但我只是自己学习C (实际上是在尝试混合C的速度和公用事业的速度C )。这有点困难...这是我无法确定的事情。

以下代码是更大程序的一部分,但是我决定写这个小部分,只是为了向您展示错误,它们的发生方式(这些都是所有的,但更多。.因为该程序更大)

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <stdio.h>
#include <numeric>
#include <string>

typedef struct stud 
{ 
    std::string name;
    unsigned int fak_no;
    struct b_date 
    {
        int M;
        int D;
        unsigned Y;
    };
    std::string adm_gr;
    std::vector <float> grades;
    float sum_div_2;
};
void imp_data ( std::vector <stud> imp_vec ( int x ) )
{
    printf ( " Import data for each person: n " );
    for ( std::vector <stud>::iterator it = imp_vec.begin(); it != imp_vec.end(); it++ 
    {
        std::cout << " for person " << ( it - imp_vec.begin() ) +1 << ": " << " n";
    std::cout << " names: ";
        std::getline (std::cin, imp_vec.at (*it).name);
    }
}
void main ()
{
    int size;
    printf ( " Number of persons: " );
    std::cin >> size;
    std::vector <stud> lads (size);
    imp_data ( lads (size) );
    system ( " pause " );
}

我通常遇到的错误是:左...实际上任何东西 -> .at().begin().end()。 - 但是如何?我认为矢量至少是一个结合,而不是说这个构成型结构。第二.. std :: getline期望3个参数...我提供了2 ...大声笑?第三,在imp_data();

上,"术语不评估为1个参数的函数";

花了太多时间试图弄清楚这一点,但仍然没有成功。如果有人能提供帮助,我将非常感激,这将确定我的学习。

std::vector <stud> imp_vec ( int x )不是对象。std::vector <stud> imp_vec是。但这确实应该是参考对对象的 std::vector <stud> & imp_vec

您通过代码都有很多类似的错别字。

在学习C 编码时,您还需要需要做的事情:先编写小件代码并编译它们。然后,您可以轻松地将语法错误和错别字固定在较小的代码上,而不是一次。

一次。

因此,在写这篇文章时,您应该从以下内容开始。

void imp_data ( std::vector <stud> imp_vec ( int x ) )
{
}

void main ()
{
    int size = 20;
    std::vector <stud> lads (size);
    imp_data ( lads (size) );
}

然后修复其中的所有错误。然后添加更多代码并重复。

您的代码中有几个改进的位置:

  • 无需混合printf()和I/O流:std::cout对于将字符串输出到控制台都可以。

  • 在C struct Something中很好,不需要typedef struct Something

  • 使用 ++it(预先提示)来增加迭代器(而不是 it++; it++是一个过早的悲观:)。

  • 学会正确格式化代码,尤其是凹痕。

  • 不包括不必要的标题。

  • 请注意,在您的imp_data()函数中,imp_vec向量由该函数填充,并且结果应传递回呼叫者,因此您应通过(non-const)参考将其传递给呼叫者:void imp_data(std::vector<stud>& imp_vec)

  • 如果使用现代C (C 11/14),则可以使用auto(或基于范围的for)进行循环迭代。至少使用auto,您不必拼写长的迭代类型名称。

请参阅您的代码的潜在改进:

#include <iostream>
#include <string>
#include <vector>
struct stud { 
    std::string name;
    // ... other fields ...
};
void imp_data(std::vector<stud>& imp_vec) {
    std::cout << "Import data for each person:n";    
    for (auto it = imp_vec.begin(); it != imp_vec.end(); ++it) {
        std::cout << "for person " << ((it - imp_vec.begin()) + 1) << ": " << " n";
        std::cout << "name: ";        
        // std::cin >> it->name;
        std::getline(std::cin, it->name);
    }
}
int main() {
    std::cout << "Number of persons: ";
    int size;
    std::cin >> size;
    std::vector<stud> lads(size);
    imp_data(lads);
    // Output names
    std::cout << "nNames:n";
    for (const auto & x : lads) {
        std::cout << x.name << std::endl;
    }
}

享受您的学习过程。