Ошибка компилятора с `<<` - PullRequest
       18

Ошибка компилятора с `<<`

0 голосов
/ 02 апреля 2009

Я работал над завершением этой программы, где она сохраняет несколько структур в файл, может прочитать их обратно и отредактировать, а затем сохранить все обратно в файл. Я работал над логикой этого, не говоря уже о большой помощи от других и куче часов поиска в Google ... теперь я получаю ошибку компиляции. Любая помощь будет принята с благодарностью.

Код:

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec);

struct InventoryItem {
    string Item;
    string Description;
    int Quantity;
    int wholesaleCost;
    int retailCost;
    int dateAdded;
} ;


int main(void)
{
    vector<InventoryItem> structList;
    ofstream out("data.dat");
    writeVector( out, structList );
    return 0;
}

template<typename T>
void writeVector(ofstream &out, const vector<T> &vec)
{
    out << vec.size();

    for(vector<T>::const_iterator i = vec.begin(); i != vec.end(); i++)
    {
        out << *i; //  error C2679
    }
}

Ошибка компилятора:

1>.\Project 5.cpp(128) : error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const InventoryItem' (or there is no acceptable conversion)
// listed overload variants skipped
1>        while trying to match the argument list '(std::ofstream, const InventoryItem)'
1>        .\Project 5.cpp(46) : see reference to function template instantiation 'void writeVector<InventoryItem>(std::ofstream &,const std::vector<_Ty> &)' being compiled
1>        with
1>        [
1>            _Ty=InventoryItem
1>        ]

Ответы [ 3 ]

8 голосов
/ 02 апреля 2009

Вы не определили operator<<, который бы указывал, как ваш InventoryItem должен быть напечатан в выходной поток Вы пытаетесь распечатать его, а компилятор не знает как. Вам нужно определить такую ​​функцию:

std::ostream& operator<<(std::ostream &strm, const InventoryItem &i) {
  return strm << i.Item << " (" << i.Description << ")";
}
0 голосов
/ 02 апреля 2009

Оператор << определяется как «сдвиг битов влево». </p>

Классы ввода-вывода переопределяют этот оператор и определяют << для обозначения печати этой структуры. </p>

Когда компилятор видит целочисленный элемент с правой стороны, он предполагает, что вы имеете в виду «сдвиг ботов влево», и ищет целое с левой стороны, но вместо этого находит объект потока ввода-вывода.

Попробуйте точно преобразовать целочисленное значение в строку перед отправкой в ​​поток.

0 голосов
/ 02 апреля 2009

Вы пытаетесь использовать оператор << для своей структуры, но этот оператор не определен для этого типа. Попробуйте вместо этого вывести определенные элементы данных.

...