Проблемы оператора с cout - PullRequest
3 голосов
/ 29 апреля 2010

У меня есть простой класс пакета, который перегружен, поэтому я могу выводить данные пакета просто с помощью cout << packagename. У меня также есть два типа данных, имя, которое является строкой и стоимость доставки с двойным. </p>

protected:
    string name;
    string address;
    double weight;
    double shippingcost;

ostream &operator<<( ostream &output, const Package &package )
{
    output << "Package Information ---------------";
    output << "Recipient: " << package.name << endl;
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost;

Проблема возникает с 4-й строкой (вывод

Я предполагаю, что это связано с типом данных, являющимся строкой для имени пакета. Есть идеи?

Ответы [ 4 ]

14 голосов
/ 29 апреля 2010

Вы должны включить неправильный заголовок строки. <string.h> и <string> - это два совершенно разных стандартных заголовка.

#include <string.h> //or in C++ <cstring>

Это для функций массивов символов с нулевым символом в конце в стиле C (например, strcpy, strcmp и т. Д.). ссылка cstring

#include <string>

Это для std::string. ссылка на строку

5 голосов
/ 29 апреля 2010

Вы, вероятно, пропали без вести #include <string>.

1 голос
/ 29 апреля 2010

Попробуйте объявить operator<< как friend в объявлении класса:

struct Package
{
public:
    // Declare {external} function "operator<<" as a friend
    // to give it access to the members.
    friend std::ostream& operator<<(std::ostream&, const Package& p);

protected:
    string name;
    string address;
    double weight;
    double shippingcost;
};

std::ostream&
operator<<(std::ostream& output, const Package& package)
{
    output << "Package Information ---------------";
    output << "Recipient: " << package.name << endl;
    output << "Shipping Cost (including any applicable fees): " << package.shippingcost;
    return output;
}

Кстати, очень плохо использовать имена переменных, имена которых совпадают с типом данных, за исключением другого регистра. Это наносит ущерб инструментам поиска и анализа. Кроме того, опечатки могут иметь некоторые забавные побочные эффекты.

0 голосов
/ 29 апреля 2010

используйте для вывода строки ..

output << "Recipient:" << package.name.c_str () << endl; </p>

...