Victor Bazarov
11/20/2008 3:22:00 AM
Wally Barnes wrote:
> 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 {
template<class T>
class AList : private ListLogic<T> {
> protected:
> struct ListNode : public ListLogic::LogicBase {
struct ListNode : public ListLogic<T>::LogicBase {
> ListNode (const T& d) : data(d) { }
> T data;
> };
> public:
> ......
> T& head () { return ((AList<T>::ListNode*)ListLogic::head())->data; }
Maybe
T& head() {
return static_cast<
typename AList::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.
I believe a static_cast should do it. And in general, the 'typename' is
required, I think.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask