错误:'std :: __ cxx11 :: list <User> :: iterator'{aka'struct std :: _ List_iterator <User>'}没有名为XXX的成员

mo2*_*mo2 1 c++

我正在学习C++,但是我的第一堂课出错了.我需要帮助才能理解这段代码的错误.

我收到以下错误消息:

main.cpp:36:13: error: 'std::__cxx11::list<User>::iterator' {aka 'struct std::_List_iterator<User>'} has no member named
 'printInfo'
         usr.printInfo();
             ^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

主函数提示用户输入其名称,创建列表和列表迭代器,显示两个用户的信息

main()函数:

#include <iostream>
#include <list>
#include "User.cpp"
using namespace std;
int main() {
    string str0 ="";
    usrs players; 
    players = create_2user();
    list<User> playerList = { players.usr0, players.usr1 };
    for( list<User>::iterator usr = playerList.begin(); usr != playerList.end(); usr++) {
        usr.printInfo();
    }       
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

班级User:

class User {
    string name;
    public:
        User();      
        void set_name (string in_name);     
        string get_name();
        void printInfo();
};
User::User()  { name="Unkonw"; }
void User::set_name(string in_name) { name  = in_name; }
string User::get_name() { return name; }
void   User::printInfo() { cout<<name; }

struct usrs { User usr0, usr1; };

usrs create_2user() {
    User array_usr[2];
    string str0;

    for(int i=0;i<2;i++) {
        cout<<"Enter player "<<i<<"'s name: ";
        cin>>str0;
        array_usr[i].set_name(str0);
    }
    usrs result = { array_usr[0], array_usr[1] };
    return result;
}
Run Code Online (Sandbox Code Playgroud)

lub*_*bgr 6

您尝试printInfo在迭代器上调用成员函数到播放器实例,而不是用户实例.你可以解决这个问题

for( list<User>::iterator usr = playerList.begin(); usr != playerList.end(); usr++) {
    usr->printInfo();
}
Run Code Online (Sandbox Code Playgroud)

或者使用循环的范围基础,为您解除引用:

for (User& usr : playerList)
    usr.printInfo(); // Here, your original syntax works
Run Code Online (Sandbox Code Playgroud)

如果你想过度设计它,你也可以开始学习<algorithm>标题和

#include <algorithm>

std::for_each(playerList.cbegin(), playerList.cend(),
    std::mem_fn(&User::printInfo));
Run Code Online (Sandbox Code Playgroud)

在C++ 20中,对于初学者来说,上述用法并不像以前那样荒谬:

std::ranges::for_each(playerList, &User::printInfo);
Run Code Online (Sandbox Code Playgroud)

请注意,由于printInfo()不会更改对象的任何状态,因此应标记此成员函数const,并const_iterator在范围base for循环内使用a for (const User& usr : playerList)和算法调用cbegin()/cend().


Rei*_*ica 5

这:list<User>::iterator usr声明usr是一个迭代器。在C ++中,迭代器类似于通用指针—指向另一个对象(1)的对象。因此,您必须像对待指针一样对待它:如果要访问所指向的对象,则必须使用*(到达该对象)或->(到达该对象的成员)取消对迭代器的引用。因此,将for循环主体中的语句更改为:

usr->printInfo();
Run Code Online (Sandbox Code Playgroud)

(1)区别在于指针指向地址,而迭代器指向容器中的位置。