如何将"<<"与我自己的结构一起使用?

How do I use "<<" with my own struct?

本文关键字:lt 一起 结构 我自己 自己的      更新时间:2023-10-16

我有以下程序来访问sqlite数据库并将表的内容放入列表容器中。

我想要的只是打印列表容器中的数据。但是我收到此错误。

error: expected primary-expression before ‘<<’ token

下面的文件是 DBAccess1.cpp

#include <iostream>
#include <sqlite3.h>
#include <list>
#include <iterator>
#include <algorithm>
#include <string>
#include <cstring>
#include <sstream>
#include "DBAccess1.h"
bool sqliteDB::GET_ALL_Site_Code(list<SiteCode>& Site_Code_list)
{
        sqlite3 *db;
        const char *sql;
        sqlite3_stmt * stmt;
        int rc = sqlite3_open("/DBsqlite3/empdbv3.db", &db);
        sql = "SELECT * FROM SiteCode;";
        rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
        while(sqlite3_step(stmt)==SQLITE_ROW) {
             int column = sqlite3_column_count(stmt);
             for(int i = 0; i < column; i++)
             {
                 int A  = sqlite3_column_int(stmt, 0);
                 int B = sqlite3_column_int(stmt, 1);
                 SiteCode info;
                 info.siteID = A;
                 info.siteCode = B;              
                 cout<<"Preparing to push data into List"<<endl;
                 Site_Code_list.push_back(info);
                 cout<<"Data was pushed successfully"<<endl;
             }//FOR LOOP ENDS HERE
        }// WHILE LOOP ENDS HERE
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    return true;
}
//=================================XX=============================//
void sqliteDB::printList()
{
     int s = Site_Code_list.size();
     cout << "The size of List is :" << s << endl;
     for( list<SiteCode> :: iterator it = Site_Code_list.begin(); it !=  Site_Code_list.end(); it++)     
     cout << it* << " "; //The ERROR occurs here

}

下面是我的DBAccess.h文件:

#ifndef DBAccess1_HH
#define DBAccess1_HH
#include <iostream>
#include <sqlite3.h>
#include <list>
#include <iterator>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
using namespace std;
struct SiteCode
{
  int siteID;
  int siteCode;
};
class sqliteDB {
public:
list<SiteCode> Site_Code_list;
bool GET_ALL_Site_Code(list<SiteCode>& Site_Code_list);
void printList();
};
#endif

下面是我的主要.cpp我从哪里调用函数:

int main()
{
    sqliteDB object1;
    list<SiteCode> Site_Code_list;
    object1.GET_ALL_Site_Code(Site_Code_list);
    object1.printList();
    cout << "nnAll the statement were executed properlynn";
   return 0;
}

我得到的错误是:

   error: expected primary-expression before ‘<<’ token
   cout << it* << " ";

你的代码中有两个"错误"。第一个是其他人都指出的。这

cout << it * << " ";

应该是这个

cout << *it << " ";

如果课程产生第二个错误

no match for ‘operator<<’ (operand types are ‘std::ostream
{aka std::basic_ostream<char>}’ and ‘SiteCode’) 
std::cout << *it << " ";

这实际上是在告诉你问题到底是什么。您正在尝试将SiteCode对象输出到流中,但没有为SiteCode对象定义<<运算符。

您需要为SiteCode结构添加以下内容。

ostream& operator<< (ostream &out, SiteCode &site)
{
    out << "(" << site.siteID << "," << site.siteCode << ")";
    return out;
}

定义结构后,在头文件中声明这一点,因此:

struct SiteCode
{
  int siteID;
  int siteCode;
};
inline ostream& operator<< (ostream &out, SiteCode &site)
{
    out << "(" << site.siteID << "," << site.siteCode << ")";
    return out;
}

现在,您将能够将<<与任何流上的任何SiteCode对象一起使用。

如何实际设置对象输出的格式取决于您。我只是选择将其显示为元组。

简介

取消引用迭代器是用*it完成的,而不是it* - 后者需要另一个操作数;"it主要表达式的乘法"。

cout << *it << " "; // fixed
<小时 />

注意

前面的"修复"将要求您定义一个适合std::coutoperator<<,以及一个类型为 SiteCode 的对象。

如果您只想以简单的方式打印列表,则可以执行以下操作:

cout << it->siteID << " " << it->siteCode << "n";