Przeciążenie operatora<< ostream nie chce działać ze stringiem

0

Treść błędu to żaden operator<<nie pasuje do tych argumentów operacji.
Co może być problemem nwm

package.h

#include <iostream>
#include <string.h>
#pragma once
using namespace std;

enum state_of_package {DELAYED, DAMEGED, NORMAL};

class package
{
private:
	static const int S_INITIAL_WEIGHT = 1500;
	static const int S_INITIAL_TIME = 7;
	static const int S_INITIAL_ID = 1;
	static const int S_INITIAL_STATE = NORMAL;
	string S_INITIAL_NAME = "SuperPostWow";
	int m_weight;  // weight of the package in grams
	string m_name; //name and surname of adresser
	int m_time;    //time left to deliver
	int m_ID;      //identification number
	int m_state;   //state of the package

public:
	package();                    
	package(int ID);
	package(const package &pack);
         friend ostream &operator<<(ostream& o, const package &pack);
	~package();
}; 

package.cpp

#include "stdafx.h"
#include "package.h"
#include <string.h>
#include <iostream>

using namespace std;


package::package()
{
	m_ID = S_INITIAL_ID;
	m_name = S_INITIAL_NAME;
	m_weight = S_INITIAL_WEIGHT;
	m_time = S_INITIAL_TIME;
	m_state = S_INITIAL_STATE;

	
}
package::package(int ID)
{
	m_name = S_INITIAL_NAME;
	m_weight = S_INITIAL_WEIGHT;
	m_time = S_INITIAL_TIME;
	m_ID = ID;
	m_state = S_INITIAL_STATE;
}
package::package(const package &pack)
{
	m_ID = pack.m_ID;
	m_weight = pack.m_weight;
	m_time = pack.m_time;
	m_name = pack.m_name;
	m_state = pack.m_state;
}

package::~package(){
}

ostream & operator<<(ostream &o, const package& pack) {
	o << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
	o << "ID:" << pack.m_ID << endl;
	o << "Days left to deliver:" << pack.m_time << endl;
	o << "Weight:" << pack.m_weight << "g" << endl;
	o << "State of the package:" << pack.m_state << endl;
	o << "Adresser:" << pack.m_name << endl;  // **<--- tu jest problem**
	o << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;

	return o;
}

main.c

#include "stdafx.h"
#include "iostream"
#include <string>
#include "package.h"

int main()
{
	int a;
	package t1;
	std::cout << t1 << endl;
	std::cin >> a;

    return 0;
}

Z góry dzięki za pomoc

0

Mi wypisuje takie coś:
Adresser:SuperPostWow

0

No właśnie tak powinno wyrzucać ,a z jakiego IDE korzystasz? Bo mi na visualu wyrzuca błąd.

0

Main jest .c czy .cpp?
Jeżeli c, zmień nazwę na cpp :)
Jeżeli cpp, to dołóż jeszcze prototyp funkcji ostream& <<... poza klasą.

2

Pomylone są pliki nagłówkowe. <string.h> to nie <string>. Pierwszy jest do obsługi cstringów a drugi od std::string, którego brakuje, a w nim jest zdefiniowany operator<< dla std::string.
Używanie globalnie przestrzeni nazw std w pliku nagłówkowym to bardzo zły nawyk. Prowadzi do trudnych w namierzeniu błędów i konfilktów.

BTW: pisząc w C++ używaj <cstring> zamiast <string.h>.

1

Od siebie też dodam ProTip'a:

Mianowicie ten fragment: #include "stdafx.h" od razu pokazuje, że korzystasz z gotowego szablonu projektu w Visual Studio. Szablon ten wprowadza kilka udziwnień, które potem mogą sprawiać Ci problemy, a także sprawiać problemy jeśli będziesz chciał ten kod gdzieś wypchnąć.
Po drugie nie ma potrzeby generować sobie dodatkowe pliki, które niczego nie wnoszą.

Wystarczy, że tworząc projekt w Visual Studio zaznaczysz opcję Empty project. Bez żadnego problemu i bez żadnej różnicy będziesz mógł dodawać swoje pliki źródłowe do projektu, który skompilujesz także bez problemu ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1