2015-04-14 3 views
0

Все мои ребята, у меня проблема с моим кодом. Я пытаюсь использовать макрос и вектор в моем коде. Но в моем коде есть ошибка, точно в макрокоде. Я не знаю, в чем ошибка. Это мой код:lvalue требуется как левый операнд ошибки присваивания в C++

#include <iostream> 
#include <vector> 
#include <string> 
#include <algorithm> 
#include <ostream> 

using namespace std; 

#define LOOP(a,b) for((int)(a) = 0; (a) < (int)(b); (a)++) 

int main(){ 

    vector<string> sentence; 
    sentence.reserve(10); 

    int i=0, c = sentence.size(); 

    sentence.push_back("Hello,"); 
    sentence.push_back("how"); 
    sentence.push_back("are"); 
    sentence.push_back("you"); 
    sentence.push_back("?"); 

    LOOP(i,c){ 
     cout << i << endl; 
    } 

    return 0; 
} 

Я надеюсь, что некоторые из вас может помочь мне решить эту проблему. С уважением.

+1

Какова ваша цель для этого '(int)' перед '(int) (a) = 0;' ?? – WhozCraig

+0

@MooingDuck по какой-либо причине он хочет использовать 'i' в' main() 'в качестве параметра макроса для' a'. В противном случае я не вижу причины для параметра макроса 'a'. Просто назвать индекс for-loop кажется таким же странным, как сам макрос – WhozCraig

+0

Вместо использования макроса, сделайте какой-то диапазон или используйте 'boost :: irange'. 'for (auto i: range (c)) {std :: cout << i;}'. Это проще, когда вам не нужны индексы: 'for (const auto & word: предложение) {std :: cout << слово;}' – chris

ответ

0

Функция expression.size() вернет 0, поскольку вы еще не ввели в нее какие-либо элементы, поэтому ваш цикл никогда не будет запущен.

Почему вы все равно используете макрос для цикла for?

4

Плохая идея использовать такие макросы в C++. Проблема заключается в том, что выражение

(int)(a) 

является Rvalue (некоторые временный объект), и вы не можете присвоить ему значение, как

(int)(a) = 0; 

Либо удалить целиком отливку или по крайней мере использовать литье как (int &).

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

vector<string> sentence; 
sentence.reserve(10); 

int i=0, c = sentence.size(); 

с будет равна 0.

Вы должны назначить гр после вызова push_back.

int i=0; 

sentence.push_back("Hello,"); 
sentence.push_back("how"); 
sentence.push_back("are"); 
sentence.push_back("you"); 
sentence.push_back("?"); 

int c = sentence.size(); 

Также я не вижу никакого отношения между вектором и контуром. По-моему эта петля

LOOP(i,c){ 
     cout << i << endl; 

не имеет смысла. Может быть, вы хотите вывести элементы вектора?

В этом случае цикл может выглядеть

for (const auto &s : sentence) std::cout << s << std::endl; 
3

Две вещи.

Во-первых: Это не должно быть макросом. Люди достаточно знакомы с семантикой цикла, что попытка макроса ... нечетна. Если это действительно беспокоит вас и ваш компилятор поддерживает C++ 11 для петель, вы можете сделать for (auto i: sentence)

Во-вторых: sentence.size() = 0, когда он ссылается, поэтому c будет 0 и никогда не будет обновляться. Ваша петля никогда не запустится.

0

Это должно сделать трюк:

#include <vector> 
#include <string> 
#include <algorithm> 
#include <ostream> 

using namespace std; 

#define LOOP(a,b) for(a = 0; a < b; a++) 

int main(){ 

     vector<string> sentence; 
     sentence.reserve(10); 

     sentence.push_back("Hello,"); 
     sentence.push_back("how"); 
     sentence.push_back("are"); 
     sentence.push_back("you"); 
     sentence.push_back("?"); 

     int i=0, c = sentence.size(); 

     LOOP(i,c){ 
      cout << i << endl; 
     } 

     return 0; 
    } 

1.) Вы заполнили свой вектор ПОСЛЕ вы просили размер, чтобы сделать ваш цикл, так что с является 0.

2.) You макрос был wrong

+1

Не исправляйте код макро-цикла, вы его разрешаете! :) – RyanP

+0

вы правы ...;) – DirkMausF