Error message: name lookup of ‘jj’ changed for ISO

2019-02-09 07:35发布

问题:

The error is:

In function ‘int returnShortestWeightedBranch(std::vector<route, std::allocator<route> >*)’:
error: name lookup of ‘jj’ changed for ISO ‘for’ scoping
note: (if you use ‘-fpermissive’ G++ will accept your code)

The code is:

for (int i = 0; i< routeVector.size(); i++)
        {
            if (routeVector[i].exitPoint == exitPointDetailsVector[preserveL].exitPoint)
            {
                cout << "\n-----------parent: " << routeVector[i].exitPoint;
                branch obj;
                obj.connectedExitPoint = exitPointDetailsVector[preserveI].exitPoint;
                routeVector[i].selectedBranchesVector.push_back (obj);

                for (int jj = 0; jj < routeVector[i].selectedBranchesVector.size(); jj++);
                {
                    cout << "\n-----------branch: " << routeVector[i].selectedBranchesVector[jj].connectedExitPoint;
                }
            }
        }

What can be the problem here?

EDIT 1:

I changed the following:

for (int jj = 0; jj < routeVector[i].selectedBranchesVector.size(); jj++);

to:

int jj;
for (jj = 0; jj < routeVector[i].selectedBranchesVector.size(); jj++);

and now it is working!! I fail to understand the REASONS.

回答1:

You have a semicolon at the end of the inner for statement. That ends the scope of jj there, so it is not visible inside the block.

Edit
You have solved the scope problem, but still have your for loop executing just

<nothing>;

Remove the semicolon after the parenthesis!



回答2:

for (int jj = 0; jj < routeVector[i].selectedBranchesVector.size(); jj++);

This line ends with a semicolon! It shouldn't :)



回答3:

Some compilers may not accept the use of the variable 'jj' after the for loop is ended. Since the variable is declared inside the for loop, it is destroyed right after it is executed. Thus when you declare your iteration variable outside the for loop it remains there for further use.

In reality it doesn't work like that and that's why you can force the compiler to ignore the error by adding '-fpermissive'.



回答4:

False: for(...;...;...;);

True: for(...;...;...;)

You shouldn't use a semicolon, ;