Solved

How to expose vector members

Posted on 2002-04-25
11
296 Views
Last Modified: 2013-12-14
I'm trying to expose certain vector members

template<class T>
class widget : private std::vector<T>
{
public:
using vector<T>::end; //This doesn't compile
vector<T>::begin;  //This also doesn't compile
};

Neither methods will compile.  My compiler is VC++ 6.0.
I don't know if it's a compiler problem, or a syntax problem.
0
Comment
Question by:MakeItWork614
  • 6
  • 2
  • 2
  • +1
11 Comments
 
LVL 4

Expert Comment

by:IainHere
ID: 6968811
using namespace std;

before the above and it will compile.  begin() and end() are public in the base class.  I don't think it is wise to change their functionality in a derived class.
0
 
LVL 2

Expert Comment

by:LoungeLizard
ID: 6969967
Interesting ...

If I might ask as an aside:

1. Is there something in the ANSI C++ standard regarding the default namespace? In the GCC the above will compile without "using namespace std" i.e. it assumes "std" is the default namespace.

2. A derived private member can be made public in this way, but it seems that a derived public member cannot be made private. I assume that is because it can be accessed in the base class anyway, hence the compiler will ignore the request the make it private in the derived class. Any thoughts?
0
 

Author Comment

by:MakeItWork614
ID: 6970176
>>using namespace std;
In my original code, I use std::vector for the inheritence.

I don't want to use a blanket using statement, because this template is going in my header file, which would bring the std namespace into the global namespace for any file using the header.
0
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 2

Expert Comment

by:LoungeLizard
ID: 6970194
In that case just use

template<class T> class widget : private std::vector<T>
{
 public:

   std::vector<T>::begin;
   std::vector<T>::end;
};

0
 

Author Comment

by:MakeItWork614
ID: 6970199
LoungeLizard,
I tried it that way, but it doesn't compile.
VC gives a compile error.
0
 

Author Comment

by:MakeItWork614
ID: 6970203
I get an error stating that begin is not a member of base class widget<T>
0
 
LVL 30

Expert Comment

by:Axter
ID: 6970208
You can try using the following method.

namespace
{
     using std::vector;
     template<class T>
          class widget : private vector<T>
     {
public:
     using vector<T>::end;
     vector<T>::begin;
     };
}

The error you're getting with VC is a VC specific compiler problem.  The original code should have been able to compile.
0
 

Author Comment

by:MakeItWork614
ID: 6970214
Axter,
That method compiles, but it still brings the std::vector into the global namespace.
0
 
LVL 30

Accepted Solution

by:
Axter earned 100 total points
ID: 6970225
>>That method compiles, but it still brings the
>>std::vector into the global namespace.

The only way around this in VC (6.0) is to put it in a specific namespace.
Example:
namespace xyz
{
    using std::vector;
    template<class T>
         class widget : private vector<T>
    {
public:
    using vector<T>::end;
    vector<T>::begin;
    };
}

0
 

Author Comment

by:MakeItWork614
ID: 6970241
Axter,
That works, but I like to keep this question open to see if someone has a better solution that will work with VC.

Thanks
0
 

Author Comment

by:MakeItWork614
ID: 6970243
Axter,
If no one comes up with something better, I'll award you the points.
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Programmer's Notepad is, one of the best free text editing tools available, simply because the developers appear to have second-guessed every weird problem or issue a programmer is likely to run into. One of these problems is selecting and deleti…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The viewer will learn how to synchronize PHP projects with a remote server in NetBeans IDE 8.0 for Windows.
The goal of the video will be to teach the user the concept of local variables and scope. An example of a locally defined variable will be given as well as an explanation of what scope is in C++. The local variable and concept of scope will be relat…

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question