Mailinglist Archive: opensuse-programming (25 mails)
| < Previous | Next > |
Re: [opensuse-programming] C++ inheritance issue
- From: Jerry Feldman <gaf@xxxxxxx>
- Date: Sat, 28 Apr 2007 11:00:03 -0400
- Message-id: <20070428110003.5702cb3b@xxxxxxxxxxx>
On Sat, 28 Apr 2007 07:45:41 +0100
John D Lamb <J.D.Lamb@xxxxxxxxxxxxxx> wrote:
> On Fri, 2007-04-27 at 14:46 -0400, Jerry Feldman wrote:
> > I have a case where the compiler is giving me an error:
> > ./FOO.H: In member function
> > Bar<ItemType>::operator()(ItemType&)':
> > ./FOO.H:447: error: `i_key' was not declared in this scope
> >
>
> I think you need to use this->i_key instead of i_key.
>
> The logic is this. C++ looks up nondependent names like i_key as soon as
> they are encountered. But it can't find i_key because it is possible for
> you to create an explicit specialization of FuBar in which i_key is not
> of type ThisType const &. Using this->i_key delays name lookup to the
> point of instantiation of the class, by which time its type will be
> known for certain.
No. this->i_key is equivalent to i_key in a member function.
The issue is with the dual template arguments. i_key is defined in the
base class as:
ThisType const & i_key;
But the inheriting class does not include the ThisType template
parameter. The correct solution, as I found out yesterday afternoon is
to refer to i_key as fully qualified:
FuBar<ItemType, type_t>::i_key;
The calling function is a member of bar with is defined as:
template <class ItemType>
class Bar : public FuBar<ItemType, type_t>
Since this code actually works in the company's other product, I was
looking at some of the compiler options rather than the correct C++
solution. (BTW: type_t is simply a typedef to an enumeration).
Actually there are 4 different classes, where 2 take type_t, 1
std:string, and the fourth, std::vector<type_t>.
It's amazing how much you look at something and know the solution, but
can't think of it.
--
Jerry Feldman <gaf@xxxxxxx>
Boston Linux and Unix user group
http://www.blu.org PGP key id:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9
John D Lamb <J.D.Lamb@xxxxxxxxxxxxxx> wrote:
> On Fri, 2007-04-27 at 14:46 -0400, Jerry Feldman wrote:
> > I have a case where the compiler is giving me an error:
> > ./FOO.H: In member function
> > Bar<ItemType>::operator()(ItemType&)':
> > ./FOO.H:447: error: `i_key' was not declared in this scope
> >
>
> I think you need to use this->i_key instead of i_key.
>
> The logic is this. C++ looks up nondependent names like i_key as soon as
> they are encountered. But it can't find i_key because it is possible for
> you to create an explicit specialization of FuBar in which i_key is not
> of type ThisType const &. Using this->i_key delays name lookup to the
> point of instantiation of the class, by which time its type will be
> known for certain.
No. this->i_key is equivalent to i_key in a member function.
The issue is with the dual template arguments. i_key is defined in the
base class as:
ThisType const & i_key;
But the inheriting class does not include the ThisType template
parameter. The correct solution, as I found out yesterday afternoon is
to refer to i_key as fully qualified:
FuBar<ItemType, type_t>::i_key;
The calling function is a member of bar with is defined as:
template <class ItemType>
class Bar : public FuBar<ItemType, type_t>
Since this code actually works in the company's other product, I was
looking at some of the compiler options rather than the correct C++
solution. (BTW: type_t is simply a typedef to an enumeration).
Actually there are 4 different classes, where 2 take type_t, 1
std:string, and the fourth, std::vector<type_t>.
It's amazing how much you look at something and know the solution, but
can't think of it.
--
Jerry Feldman <gaf@xxxxxxx>
Boston Linux and Unix user group
http://www.blu.org PGP key id:C5061EA9
PGP Key fingerprint:053C 73EC 3AC1 5C44 3E14 9245 FB00 3ED5 C506 1EA9
| < Previous | Next > |