2016-07-27 16 views
-1

Мне очень трудно найти правильный способ перегрузить оператор + =. что, по-видимому, является самым популярным методом его выполнения, но, похоже, не соответствует потребностям этой программы. Если кто-нибудь может помочь мне решить эту ошибку компилятора или указать мне в правильном направлении, это было бы потрясающе. Вот код.Получение «no match for» operator + = ', не известное преобразование из аргумента 1 из' int 'в' const ItemStack & '

функция Проблема ...

////////////storage.cpp 
void storeItems(istream &inf, vector<ItemStack> &items){ 
int id = 0; //temporary id 
int q = 0; //temporary count 

cout << "Processing Log" << "\n"; 
printHorizontalLine(cout, '-', 36); 

while(inf >> id >> q){ 
    int loc = sequentialSearch(items, id); 

    if(loc != -1){ 
     items[loc] += q; <------ This operator is causing the error. 

     cout << " Stored " 
      << right << setw(3) << q << " " 
      << items[loc].getName() 
      << "\n"; 
    } 
    else{ 
     cout << " Invalid ID (" << id << ")" << "\n"; 
    } 
} 
println(); 
} 

///////////itemstack.cpp 

ItemStack::ItemStack(int i, std::string n){ 
id  = i; 
name  = n; 
quantity = 0; 
} 

/** 
* 
*/ 
//void ItemStack::add(int amount){ 
// quantity += amount; 
//} 
inline 
ItemStack& ItemStack::operator+= (const ItemStack &rhs) 
{ 
quantity+= rhs.quantity; 
return *this; 
} 

inline 
ItemStack operator+(ItemStack lhs, const ItemStack& rhs) 
{ 
lhs += rhs; 
return lhs; 
} 

/** 
* 
*/ 
bool ItemStack::lowSupply(){ 
// Note the similarity to a condition in an if statement 
return (quantity < 10); 
    } 

bool ItemStack::operator== (const ItemStack& s1) const 
{ 
    return id == s1.id 
    && quantity == s1.quantity 
    && name == s1.name; 
} 

bool ItemStack::operator< (const ItemStack& s1) 
{ 
    return id == s1.id; 
} 

inline 
ostream& operator<<(std::ostream &outs, const ItemStack &prt) 
    { 
    return outs; 
} 

`

+0

Ваш оператор в порядке, это просто * как * вы используете неправильно. – Rakete1111

+0

Итак, что вы ожидали, произойдет в 'items [loc] + = q'? Вы ожидали, что 'q' получит неявное преобразование в тип« ItemStack »? Или что-то другое? – AnT

+0

Если я определяю + = как взятие int в качестве параметра, я получаю неопределенную ссылку на «ItemStack :: operator + = (int const &) error. Мне трудно получить переменную, которой нет в классе, добавленном к переменной класса, которая уже является int, используя этот перегруженный оператор. – Zivian

ответ

2

Ваш operator+= определяется как

ItemStack& ItemStack::operator+= (const ItemStack &rhs) 

operator+= определяется для ItemStack & параметра.

Вы пытаетесь использовать его следующим образом:

items[loc] += q; 

q является int, а не ItemStack. Ваш оператор += определен только для ссылки ItemStack.

+0

Итак, чтобы добавить целое число к объекту стека элементов, можно подумать, что я просто изменил бы параметр на int вместо ссылки ItemStack. Я получаю неопределенную ошибку ссылки, когда я это делаю. – Zivian

+0

Выполнение случайных изменений кода, без фактического понимания того, как работает перегрузка оператора, вряд ли даст желаемые результаты. –