Newsgroup: comp.lang.c++
Subject: Not able to access inherited protected member?
From: Shriramana Sharma <samjnaa@...>
Date: Thu, 27 Jun 2013 11:10:19 -0700 (PDT)
Hello. Please consider the following minimized example for the problem I am facing.
>>>-------------------------------
template < typename T >
struct item {
typedef item<T> * pointer ;
pointer prev, next ;
} ;
template < typename ItemPtr >
struct iterator_base {
public:
iterator_base () : ptr(0) {}
protected:
ItemPtr ptr ;
explicit iterator_base ( ItemPtr p ) : ptr(p) {}
} ;
template < typename T >
struct iterator : public iterator_base < item<T> * > {
template<typename> friend class const_iterator ;
} ;
template < typename T >
struct const_iterator : public iterator_base < const item<T> * > {
const_iterator () {}
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
} ;
int main () {
iterator<int> it ;
const_iterator<int> cit ;
cit = it ;
}
<<<------------------------
I get the error messages:
>>>-------------------------------
$ g++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp: In constructor ?const_iterator<T>::const_iterator(const iterator<T>&)?:
iterator-base-minimal-2.cpp:28:46: error: class ?const_iterator<T>? does not have any field named ?ptr?
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
^
$ clang++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp:28:46: error: member initializer 'ptr' does not name a non-static data member or base class
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
^~~~~~~~~~~
1 error generated.
<<<-------------------------------
I am not sure why I can't access ptr which is a protected member of a parent class. OK so anyhow I thought I'll explicitly scope it by the base type and so I changed the const_iterator definition to:
>>>-------------------------------
template < typename T >
struct const_iterator : public iterator_base < const item<T> * > {
typedef iterator_base < const item<T> * > base ;
const_iterator () {}
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
} ;
<<<-------------------------------
But now I get even more cryptic error messages:
>>>-------------------------------
$ g++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp: In instantiation of ?const_iterator<T>::const_iterator(const iterator<T>&) [with T = int]?:
iterator-base-minimal-2.cpp:35:6: required from here
iterator-base-minimal-2.cpp:28:62: error: no type named ?ptr? in ?struct iterator_base<const item<int>*>?
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^
$ clang++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp:28:52: error: typename specifier refers to non-type member 'ptr' in 'iterator_base<const item<int> *>'
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^~~
iterator-base-minimal-2.cpp:35:8: note: in instantiation of member function 'const_iterator<int>::const_iterator' requested here
cit = it ;
^
iterator-base-minimal-2.cpp:13:10: note: referenced member 'ptr' is declared here
ItemPtr ptr ;
^
iterator-base-minimal-2.cpp:28:52: error: 'ptr' is a protected member of 'iterator_base<const item<int> *>'
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^
iterator-base-minimal-2.cpp:13:10: note: must name member using the type of the current context 'const_iterator<int>'
ItemPtr ptr ;
^
2 errors generated.
<<<-------------------------------
I'm using GCC 4.8.1 and Clang 3.2 on Kubuntu Raring 64-bit. Can anyone please tell me what the problem is and how I can solve it? Thank you very much!
Subject: Not able to access inherited protected member?
From: Shriramana Sharma <samjnaa@...>
Date: Thu, 27 Jun 2013 11:10:19 -0700 (PDT)
Hello. Please consider the following minimized example for the problem I am facing.
>>>-------------------------------
template < typename T >
struct item {
typedef item<T> * pointer ;
pointer prev, next ;
} ;
template < typename ItemPtr >
struct iterator_base {
public:
iterator_base () : ptr(0) {}
protected:
ItemPtr ptr ;
explicit iterator_base ( ItemPtr p ) : ptr(p) {}
} ;
template < typename T >
struct iterator : public iterator_base < item<T> * > {
template<typename> friend class const_iterator ;
} ;
template < typename T >
struct const_iterator : public iterator_base < const item<T> * > {
const_iterator () {}
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
} ;
int main () {
iterator<int> it ;
const_iterator<int> cit ;
cit = it ;
}
<<<------------------------
I get the error messages:
>>>-------------------------------
$ g++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp: In constructor ?const_iterator<T>::const_iterator(const iterator<T>&)?:
iterator-base-minimal-2.cpp:28:46: error: class ?const_iterator<T>? does not have any field named ?ptr?
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
^
$ clang++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp:28:46: error: member initializer 'ptr' does not name a non-static data member or base class
const_iterator ( const iterator<T> & it ) : ptr(it.ptr) {}
^~~~~~~~~~~
1 error generated.
<<<-------------------------------
I am not sure why I can't access ptr which is a protected member of a parent class. OK so anyhow I thought I'll explicitly scope it by the base type and so I changed the const_iterator definition to:
>>>-------------------------------
template < typename T >
struct const_iterator : public iterator_base < const item<T> * > {
typedef iterator_base < const item<T> * > base ;
const_iterator () {}
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
} ;
<<<-------------------------------
But now I get even more cryptic error messages:
>>>-------------------------------
$ g++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp: In instantiation of ?const_iterator<T>::const_iterator(const iterator<T>&) [with T = int]?:
iterator-base-minimal-2.cpp:35:6: required from here
iterator-base-minimal-2.cpp:28:62: error: no type named ?ptr? in ?struct iterator_base<const item<int>*>?
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^
$ clang++ -o iterator-base-minimal-2 iterator-base-minimal-2.cpp
iterator-base-minimal-2.cpp:28:52: error: typename specifier refers to non-type member 'ptr' in 'iterator_base<const item<int> *>'
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^~~
iterator-base-minimal-2.cpp:35:8: note: in instantiation of member function 'const_iterator<int>::const_iterator' requested here
cit = it ;
^
iterator-base-minimal-2.cpp:13:10: note: referenced member 'ptr' is declared here
ItemPtr ptr ;
^
iterator-base-minimal-2.cpp:28:52: error: 'ptr' is a protected member of 'iterator_base<const item<int> *>'
const_iterator ( const iterator<T> & it ) : base::ptr(it.ptr) {}
^
iterator-base-minimal-2.cpp:13:10: note: must name member using the type of the current context 'const_iterator<int>'
ItemPtr ptr ;
^
2 errors generated.
<<<-------------------------------
I'm using GCC 4.8.1 and Clang 3.2 on Kubuntu Raring 64-bit. Can anyone please tell me what the problem is and how I can solve it? Thank you very much!
via Usenet Forums - Usenet Search,Free Usenet - comp.lang.c++ http://www.pocketbinaries.com/usenet-forums/showthread.php?29996-Not-able-to-access-inherited-protected-member&goto=newpost
View all the progranning help forums at:
http://www.pocketbinaries.com/usenet-forums/forumdisplay.php?128-Coding-forums
No comments:
Post a Comment