Problem with depracated casting method (down casting)

W

Wally Barnes

Can someone help a poor C++ programmer that learned the language before
there was a standard lib .. etc ?

Basically I have two classes that look something like below:


template <class T>
class ListLogic {
public:
struct LogicBase {
LogicBase () : next(0) { }
LogicBase* next;
};
protected:
LogicBase* head ();
};

template <class T>
class AList : private ListLogic {
protected:
struct ListNode : public ListLogic::LogicBase {
ListNode (const T& d) : data(d) { }
T data;
};
public:
......
T& head () { return ((AList<T>::ListNode*)ListLogic::head())->data; }
};

The 'AList<T>::head()' function is supposed to return the first item in the
list by taking the LogicBase pointer returned by the 'ListLogic::head()'
function and casting it a ListNode struct pointer. Then derefencing it to
retrieve the 'data' part of the ListNode struct.

On earlier versions of g++, this compiles and works fine albeit with the
following warnings:

"warning: `typename AList<T>::ListNode' is implicitly a typename"
"warning: implicit typename is deprecated"

The problem is that on newer versions of g++ the same code now is an error
with the following verbage:

"In member function 'T& AList<T>::head()':"
"error: expected primary-expression before ')' token"
"error: expected `)' before 'ListLogic'"

So it seems the old style casting used previously is no longer allowed. What
is the stardard compliant method of down casting the ListLogic::LogicBase
pointer to the AList<T>::ListNode pointer ? Thanks in advance for any
assistance.

-Wally
 
A

Andrey Tarasevich

Wally said:
So it seems the old style casting used previously is no longer allowed. What
is the stardard compliant method of down casting the ListLogic::LogicBase
pointer to the AList<T>::ListNode pointer ? Thanks in advance for any
assistance.

The error you are getting has absolutely noting to do with casing per
se. It is about the way you specify the name of the type. In certain
contexts type names that depend on the template parameters must be
preceded with the keyword 'typename'. Use 'typename AList<T>::ListNode*'
in you cast. However, when it comes to casting pointers along class
hierarchy, it is always better to use the new C++ casts instead of old
C-style casts. In your case that would be 'static_cast'.
 
W

Wally Barnes

Andrey said:
The error you are getting has absolutely noting to do with casing per
se. It is about the way you specify the name of the type. In certain
contexts type names that depend on the template parameters must be
preceded with the keyword 'typename'. Use 'typename AList<T>::ListNode*'
in you cast. However, when it comes to casting pointers along class
hierarchy, it is always better to use the new C++ casts instead of old
C-style casts. In your case that would be 'static_cast'.

Andrey,

Thanks for the response. The issue was resolved tow different ways. The
first by inserting the 'typename' keyword inside the existing old style
cast. The other using the 'static_cast<>' new C++ standard cast. Thanks
again for the update to my outdated mental C++ database.

-Wally
 
W

Wally Barnes

Victor said:
template<class T>




Maybe

T& head() {
return static_cast<
typename AList::ListNode*

I believe a static_cast should do it. And in general, the 'typename' is
required, I think.

V

Victor,

Thanks for the response. The issue was resolved tow different ways. The
first by inserting the 'typename' keyword inside the existing old style
cast. The other using the 'static_cast<>' new C++ standard cast. Thanks
again for the update to my outdated mental C++ database.

-Wally
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,733
Messages
2,569,440
Members
44,830
Latest member
ZADIva7383

Latest Threads

Top