Dave
Dave

Reputation: 1057

Unusual Error: expected unqualified-id before ')' token

I am trying to take a list data type I created and make it a template. In doing so I've run into the following obscure problem. I can post all of the code if needed, but this is really the function that is causing the problem.

Note: This code was compiling just fine until I got to this method. I was compiling after writing every few lines as a sanity check, and everything was fine, but then I get to this point and it blows up. If I take the try/catch block out of this method it compiles just fine, so I'm pretty sure the problem is isolated there, not a missing semicolon in a header/etc. as reported from other answers -- though I did of course triple-check to be sure! :)

Here's the code that is causing the problem:

template<class T>
bool UnsortedListType<T>::IsFull()
{
    try { return false; }
    catch(std::bad_alloc exception) { return true; }  // line 35
}

Like I said, I simplified it as much as possible while still triggering the error. Here is the error:

UnsortedListType.cpp||In member function 'bool UnsortedListType<T>::IsFull()':
UnsortedListType.cpp|35|error: expected type-specifier
UnsortedListType.cpp|35|error: expected unqualified-id before 'exception'
UnsortedListType.cpp|35|error: expected ')' before 'exception'
UnsortedListType.cpp|35|error: expected '{' before 'exception'
UnsortedListType.cpp|35|error: 'exception' was not declared in this scope
UnsortedListType.cpp|35|error: expected ';' before ')' token

Everything I can find on this error says the problem is either an extra semicolon or a missing semicolon, either in the header or this file. I can't find an instance of either. And if I remove the try/catch block, it compiles fine.

Plus, if I catch an int, it compiles just fine:

template<class T>
bool UnsortedListType<T>::IsFull()
{
    try { return false; }
    catch(int exception) { return true; }
}

I can also catch(int) and it will compile just fine, but if I try to catch(std::bad_alloc) (i.e. with no "exception" variable name) it throws the same error listed above. Even if I try simply catch(std::exception) it fails to compile.

So now I'm stumped. I'm not an expert at C++ by any stretch, this is for a class, and I'm not sure how to get past this error.

Incidentally, here's the code from the non-generic version, which also compiles just fine, and is verbatim from the textbook I'm using (Dale, if anyone wonders):

bool UnsortedListType::IsFull() const
{
    NodeType* location;
    try
    {
        location = new NodeType;
        delete location;
        return false;
    }
    catch (std::bad_alloc exception)
    {
        return true;
    }
}

I am using CodeBlocks 12.11 IDE on Windows 7 with the built-in GNU compiler.

Any help appreciated, and I'll be happy to post more code if requested, I just didn't want to fill the page up.

Many thanks in advance.

PS I should state, yes I am doing homework, but the homework doesn't call for me to make a template, I am choosing to go that route myself. Not sure if it has any relevance, but this is the first time I've used C++ templates, so just tossing that out there.

Upvotes: 1

Views: 9916

Answers (1)

Potatoswatter
Potatoswatter

Reputation: 137930

std::bad_alloc is defined in the header <new>, so you need to include that.

Also, it's better to catch exceptions by reference. Catching by value causes a copy, perhaps sliced, of the exception object to be made. Personally I make non-const reference a habit, allowing exception state to be added during handling, but most basic exception types are stateless so there's no practical difference between const & and non-const &.

Upvotes: 3

Related Questions